2013-10-11 1 views
4

최근에이 코드를 보았지만 지금 무슨 일이 일어나고 있는지 이해하지 못했습니다.C++로 벡터 생성하기

auto c = vector<int> {}; 

벡터 생성자는 무엇을 반환합니까?

이어서 코드 :

c = vector<int> {1,2,3,4,5 }; 

초기 c에 다른 메모리 위치에서 제 c인가?

c을 다시 초기화 할 때 소멸자가 호출됩니까?

인터넷을 검색했지만 위의 코드 예제를 찾을 수 없습니다.

어떻게 사전에 어떤 도움

vector<int> c {}; 

덕분에 위 다르다.

+1

짧은 답변 : 즉 C++ 11 – jrd1

+1

그렇지 않으면 꺾쇠 괄호 텍스트가 자동 C = 벡터 {}'의 차이에 관해서는 제대로 – codeling

+0

을 표시되지 않습니다, 올바른 형식을 사용하십시오이다; '및'벡터 c {};', Herb Sutter의 [거의 항상 자동] (http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/ 참조)) 스타일. – Angew

답변

2

'첫 번째 c'는 변수 c (int의 벡터)가 정의 된 곳입니다.

auto c = vector<int> {}; 

'두 번째 c'는 c 값의 재 할당입니다. 새로운 변수가 아니기 때문에 c의 메모리 주소는 변경되지 않고 c의 소멸자는 호출되지 않습니다. 실제로 어떻게됩니까

c = vector<int> {1,2,3,4,5 }; 

벡터 {1,2,3,4,5}의 값 1,2,3,4,5로 초기화 목록에서 초기화 형 벡터의 임시 객체를 생성한다는 것입니다 . 이 임시 객체는 c의 복사 생성자 (또는 C++ 11)에 전달 생성자를 전달하여 c가 현재 값 (있는 경우)을 임시 객체의 값으로 바꿉니다.

c의 소멸자는 범위를 벗어날 때까지 호출되지 않습니다 (예 : 함수 종료 또는 정의 된 제어 블록 {}).

5

"jrd1가 말했듯이, 그것은 C++ 11 기능입니다.

auto 기본적으로 컴파일러를 할 수 있다는 것을 의미 키워드" "변수의 유형을 것 같아요.

것은 그래서 c는 일반 vector<int>입니다 .

+3

"추측"은 조금 가혹합니다. 유형을 완전히 추론 할 수없는 경우 컴파일되지 않습니다. –

+0

사실, 큰 따옴표도 넣을 것입니다. :) – elnigno

+1

질문의 3 분의 1의 첫 번째 부분에 대해서만 대답하고 있습니다 ... – codeling

3

는 반환 벡터 생성자 무엇입니까?

empty vector<int>; 컴파일러는 해당 생성자 호출에서 변수 c의 유형을 추론합니다. 즉 cvector<int>이됩니다. auto은 기본적으로 변수 유형을 두 번 입력하는 것을 절약합니다. 어쨌든 생성자 호출에서 이미 지정되었으므로 이제는 변수 이름 앞에 두 번 입력 할 필요가 없습니다. 대신 auto을 사용할 수 있습니다.

두 번째 c는 초기 c와 다른 메모리 위치에 있습니까?

아니요, 동일한 벡터입니다. 값이 1,2,3,4 및 5 인 vector<int>operator=을 통해 c에 할당됩니다. 즉, c 그 자체의 주소 (&c)는 변경되지 않습니다. 그러나 포함 된 데이터 (예 : c.data()의 결과)는 변경 될 수 있으며 변경 될 수 있습니다.

c를 다시 초기화 할 때 소멸자가 호출됩니까?

아니요 c의 소멸자입니다. 임시의 것 하나.

+0

메모리 위치 비트를 명확히하기 위해 : '& c'는 변경되지 않지만'c.data()'는 아마도 변경됩니다. – ComicSansMS

+0

좋은 지적. 아마 주목할 가치가있는 – codeling

1

첫 번째 줄과 마지막 줄은 기능적으로 동일합니다.할당에 대한

:

c = vector<int> {1,2,3,4,5 }; 

C가 파괴되지 않거나 나중에 새 메모리 조작에 위치. 이름없는 두 번째 벡터가 5 개의 값으로 생성되고 vector::operator=이 해당 벡터의 내용을 c에 할당하는 데 사용됩니다. 이것은 C++ 11의 이동 작업에서 발생합니다. 그 후에 임시 벡터가 파괴되고 소멸자가 호출되지만 c의 소멸자는 호출되지 않습니다.

1

C++ 11에는 유형 추론이 포함 된 auto 키워드가 포함되어 있습니다.
코드를 크게 단순화하는 데 도움이됩니다.
예 :

auto itr = vec.iterator(); // instead of vector<int>::iterator itr