2016-09-02 2 views
1

매우 비슷한 두 세트의 코드가 있습니다. 나는 그들이 연속적으로 또는 심지어 같은 프로그램에 있지 않다는 것을 강조하고 싶다. I 단지 그들 설명을 목적으로 나란히 가지고반복자의 데이터를 목록에 삽입하는 문제

std::list<int*> bob; 
int * j = new int; 
*j = 5; 
bob.push_front(j); 
std::list<int>::const_iterator goop = bob.begin(); 
bob.push_front(*goop); //takes issue with inserting goop 

std::list<int> bob; 
j = 5; 
bob.push_front(j); 
std::list<int>::const_iterator goop = bob.begin(); 
bob.push_front(*goop); //inserts goop just fine 

첫 번째 정수에 대한 포인터의리스트, 제 단지 정수이다. 첫 번째는 typage에 대해 불평 삽입하려고 할 때 특별히 원하는, 반복자를 역 참조 나와 함께 문제를한다 "INT의 *의 CONST는 &"

여기 무슨 일이야? 반복자가 기본 데이터를 참조하는 방법에 대해 내가 잘못 이해하고 있고 목록의 반복자에서 목록에 삽입 할 수 있도록 두 번째 경우를 실행해야하는 방법은 무엇입니까?

답변

3

변경이이에

std::list<int>::const_iterator goop = bob.begin(); 

:

std::list<int*>::const_iterator goop = bob.begin(); 

당신이 당신의 예에서 정수에 포인터를 원하기 때문에

.

1

사용중인 반복기는 list<int>::const_iterator이지만 list<int*>을 반복하는 데 사용하고 있습니다.

list<int*>을 반복하려면 list<int*>::const_iterator을 사용해야합니다.

+0

폴, 내가 당신보다 더 빨리 이중했다 보인다! :) 그러나 우리는 해결책이 무엇인지에 동의합니다, 그렇죠? :) +1! – gsamaras

0

귀하의 혼란을 이해하지 못합니다. list 부분은 완전히 관련이 없습니다. 여기에서하려고하는 것은 :

int* j = new int; 
int i = j; // illegal, pointer vs integer 
j = i; // illegal, integer vs pointer 

간단합니다.

std::list<int*> bob; 

포인터int에 르 값 (int*)의리스트이다. 값 유형은 매우 간단합니다 (int*).

int * j = new int; 

j는 정수

*j = 5; 

이 라인에 대한 포인터입니다 전혀 문제와 무관하다.

bob.push_front(j); 

이것은 최근 할당 주소를 목록의 맨 앞에 푸시합니다. 값 5가 아니라 메모리의 주소.

std::list<int>::const_iterator goop = bob.begin(); 

goop 치형 int하지 int*와리스트 반복자이므로 list<int>list<int*>과 완전히 별개의 유형 때문에이 라인 (http://ideone.com/zfmvPR)를 컴파일되지 않는다.이전 라인 컴파일이 있다면 *goop이 유형 int을 가지고 있지만 bob의 값 유형이 int*하지 int 때문에

bob.push_front(*goop); //takes issue with inserting goop 

이 불법이 될 것입니다.

bob.push_frontint*입니다. *goopint입니다. 아마 당신은해야,

아마도 당신은 C++ 11

std::list<int*> bob; 
bob.push_front(new int); 
auto it = bob.begin(); // std::list<int*>::iterator it = bob.begin(); 
// or auto it = bob.cbegin(); if you want a const_iterator 
pop.push_front(*it); 

에서 auto 키워드를 활용 고려해야하지만 C++ 11을 사용하려고하고있는 경우 목록이 포인터의 소유권에 대한 책임 표시된 코드에 delete이 표시되지 않으므로 std::unique_ptr을 사용하는 것이 좋습니다. 당신이 실수 할 때

std::list<unique_ptr<int>> bob; 

또한 것은 많은 명확 지금 :

std::list<unique_ptr<int>> bob; 
std::list<int> sally; // clearly not compatible with bob.