ㄱ.   new로 생성한 것은 객체에 대해서는 유효 범위를 벗어 나면 스스로 지워 지는 것이 아니라, 직접 delete를 해 주어야 한다.
- for
문을 사용 하여 delete 해 줄 시

    for_each 만큼 명확하지 않다.

    예외 안전성이 갖추고 있지 않다.
-
포인터 컨테이너 대신에 스마트 포인터의 컨테이너를 사용하는 것
.
-
스마트 포인터 사용시 auto_ptr은 피해야 함
.
- boost
라이브러리에 있는 shared_ptr을 사용.


class Widget
{

};

typedef std::vector< Widget* > VecWidget;

/// for문을 사용한 해제.
void doSomething()
{
	VecWidget widget;

	for( VecWidget::iterator it = widget.begin(); it != widget.end(); ++it)
	{
		delete (*it);
	}
}
/// for_each문을 사용한 해제 - 1.
template<typename t="">
struct DeleteObject
	: public unary_function<const t*,="" void="">
{
	void operator() (const T* ptr) const
	{
		delete ptr;
	}
};
void doSomething()
{
	VecWidget widget;

	/// Widget의 포인터를 삭제 하는 것이 당연하지만, 실수로 Widget 외의
	/// 것을 할 경우 버그를 발생할 우려가 있음.
	for_each(widget.begin(), widget.end(), DeleteObject<widget>())
}

/// for_each문을 사용한 해제 - 2.
struct DeleteObject
{
	template<typename t="">
	void operator() (const T* ptr) const
	{
		delete ptr;
	}
};
void doSomething()
{
	VecWidget widget;

	/// Widget의 포인터를 삭제 하는 것이 당연하지만, 실수로 Widget 외의
	/// 것을 할 경우 버그를 발생할 우려가 있음.
	for_each(widget.begin(), widget.end(), DeleteObject())
}
</typename></widget></const></typename>

Posted by 냉동

ㄱ.   단일 요소 멤버 함수보다 범위 멤버 함수가 더 좋은 이유.

    범위 멤버 함수를 사용한 코드가 대개 짧다.

    범위 멤버 함수는 훨씬 명확하고 간결한 의미를 전달 한다.

ㄴ.   단일 요소 멤버 함수에서는 메모리 할당자의 요구 많음.
객체 복사도 빈번, 불필요한 연산도 자주 일어남
.
같은 일은 한다면, 범위 멤버 함수는 이 보다 효율적.

ㄷ.   copy를 사용하여 루프 없이 비슷해 보이지만 범위 단위로 동작하는 멤버 함수보다 비효율적인 면이 있다.

    불필요한 함수 호출 범위 멤버 함수는 한번만 하면 되기 때문.

    새로운 요소를 넣기 위해 들어 있던 요소를 밀어 넣는 비용.

    메모리 할당.

ㄹ.   범위 멤버 함수.

    범위 생성 모든 컨테이너는 다음과 같은 생성자를 지원.
container::container(Inputlterator begin, Inputlterator end);

    범위 삽입 모든 표준 컨테이너는 다음과 같은 insert를 지원
void contatiner::insert(iterator position, Inputiterator begin, Inputiterator end);
연관 컨테이너
void contatiner::insert(Inputiterator begin, Inputiterator end);

    범위 삭제
iterator contation::erase(iterator begin, iterator end); -
표준 시퀀스 컨테이너
void contation::erase(iterator begin, iterator end); -
표준 연관 컨테이너

    범위 대입 모든 표준 시퀸스 컨테이너
void contatiner::assign(Inputiterator begin, Inputiterator end);

 

#include "stdafx.h"
#include < iostream >
#include < string >
#include < vector >

class CTest
{
public:
	CTest(const int _kiID)
		: m_iID(_kiID)
	{
		cout << "ID : "<< m_iID << " 디폴트 생성자 호출" << endl;
	}
	CTest(const CTest& _krTest)
		: m_iID(_krTest.m_iID)
	{
		cout << "ID : "<< m_iID << "복사 생성자 호출" << endl;
	}
	const CTest& operator = (const CTest& _krTest)
	{
		this->m_iID = _krTest.m_iID;
		cout << "ID : "<< m_iID << "대입 연산자" << endl;

		return *this;
	}
	~CTest()
	{
		cout << "ID : "<< m_iID << "소멸자" << endl;
	}
private:
	int m_iID;
};


int _tmain(int argc, _TCHAR* argv[])
{
	CTest TestArr[5] = {1, 2, 3, 4, 5};

	cout << "=====================================================" << endl;

	std::vector< CTest > VecTest1;
	std::vector< CTest > VecTest2;

	VecTest1.insert(VecTest1.begin(), TestArr, TestArr + 5);

	cout << "=====================================================" << endl;

	copy(TestArr, TestArr + 5, inserter(VecTest2, VecTest2.begin()));
	return 0;
}
Posted by 냉동

empty는 모든 표준 컨테이너에 대해 상수 시간에 수행 하지만, 몇몇 제품에서 구현된 list 클래스에서 size가 선형 시간에 수행 되기 때문에 컨테이너가 비어 있는지를 확인 할 때 empty를 사용하여 비용?을 줄이자

Posted by 냉동