2013-05-13 1 views
1

나는 점점 더 많은 시간을 내 코드에 낭비하여 점점 더 혼란스러워지고있다. 난 그저 이터레이터의 내용이 아니라 그 주소를 원한다. *itPep주소가 아님 콘텐츠를 원하십니까?

반복자는 * 연산자를 오버로드 및 데이터를 반환 : 당신이 그것에 내용, 포인트를 원하는 경우

Peptides tempPep; 
tempPep.set_PEPTIDE("AABF"); 
std::vector<Peptides>::iterator itPep = std::find_if (this->get_PepList().begin(), this->get_PepList().end(),boost::bind(&Peptides::Peptide_comparison, _1,tempPep)); 
if (itPep != this->get_PepList().end()) 
{ 

    Spectra tempSp; 
    tempSp.set_Charge(1127); 
    tempSp.set_Snum(1); 
    std::cout << "without iterator "<< this->get_PepList()[0].get_New_S_num() << std::endl; 
    // output -> 0 
    std::cout << "with iterator" << itPep->get_New_S_num() <<std::endl; 
    //output -> 1129859637 
} 
+1

은 무엇'get_PepList()가'사본 또는 참조를 반환합니까? 'itPep'은 호출로부터 반환 된 벡터가 만료되었을 때 아마도 매달려 있습니다. –

+0

C++ 유형은 가장 중요합니다. 'Peptides' 란 무엇이고'this'의 타입은 무엇이고'get_PepList()'와'get_New_S_num()'은 어떻게 작동합니까? –

답변

2

는 다음에 코드를 변경해보십시오 :

std::vector<Peptides> p = this->get_PepList(); 
std::vector<Peptides>::iterator itPep = std::find_if (p.begin(), 
    p.end(),boost::bind(&Peptides::Peptide_comparison, _1,tempPep)); 
+0

고마워요! 좀 더 제발 그것을 설명 할 수 있을까요? – khikho

+1

@khikho :'this-> get_PepList()'에서 반환 된 벡터의 유효 기간은'this-> get_PepList()와 같이 호출하기 때문에'std :: find_if'를 호출 할 때 줄 끝에서 만료됩니다. begin()'. 이것은 itPep이 더 이상 존재하지 않는 벡터에 반복자를 가지고 있음을 의미합니다. 벡터가 유효하게 유지되도록하기 위해'get_PepList()'에서 반환 된 벡터를 변수, 즉'std :: vector p = this-> get_PepList();'로 복사하도록 코드를 변경했습니다. 이렇게하면'itPep' iterator로 요소 중 하나에 접근 할 때 벡터가 여전히 주위에 있음을 보장합니다. –

1

: 여기 내 코드입니다. (감사 보정, 난 몰랐어!)

+0

'itPep'는 직접 주소가 아닙니다. 반복자 (iterator)는'*'연산자를 오버로드하고 거기에서 데이터를 리턴한다. –

+0

Thanks @ Magtheridon96! –

+0

또한 \\ \를 사용하여 텍스트 스 니펫을 둘러싸면 비슷한 코드를 표시 할 수 있습니다. ; p (당신을 위해 이것을 편집하겠습니다) –

관련 문제