2014-06-17 3 views
1

에서 const가 아닌 값을 얻는 방법 :I 클래스가있는 경우 벡터

: 방법 쓰기에

vector<T> collection; 

하고 싶은 :

class T{ 
    public: 
    int Id; 
    //some methods, constructor.. 
} 

다른 클래스를

T& getValue(int Id){ 
    //scanning the vector till i find the right value 
} 

반복자를 통해 벡터를 검사하면 항상 const 값이 주어 지므로 한정자에 대한 오류가 발생합니다. 그렇다면 벡터로부터 어떻게 가치를 얻을 수 있습니까? 하지만 const가 아닙니다.

편집은 다음 답변에 따라 내가 노력에 따라서이 같은 :

Group& Server::findGroup(unsigned int userId) const{ 
    for(auto iterator=groups.begin();iterator!=groups.end();++iterator){ 
      if(iterator->isInGroup(userId)){ 
       return (*iterator); 
      } 
     } 
     //throw exception here 
} 

그룹의 정의 : 벡터 그룹;

이것은 내가 처음에 준 것과 정확히 똑같은 예입니다. 그러나 지금 T는 Group입니다.

+1

const가 필요 없다고 가정하면 벡터 내에서 수정하려고한다고 가정합니다. – Montaldo

+0

왜 반복자를 통해 벡터를 검사하면 항상 const가 제공되는 것으로 생각합니까? 'std :: find'가 비 const 반복자를 전달하면 비 const 반복자를 반환합니다. –

+0

이 목적으로'std :: find'를 사용할 수 있습니다. [here] (http://en.cppreference.com/w/cpp/algorithm/find) –

답변

3

다음 코드는 당신에게 비 const 반복자를주고 잘 작동합니다 :

for(vector<T>::iterator i = collection.begin(); 
    i != collection.end(); ++i) { 
    if(Id != i->Id) 
     continue; 
    // Matching ID! do something with *i here... 
    break; 
} 

를이 방법으로 문제가 해결되지 않으면, 깨진 무엇인지 더 자세히 설명해주십시오.


여기서 문제는 선언에서 const입니다 :

Group& Server::findGroup(unsigned int userId) const //<==THIS 

groups을 포함,뿐만 아니라 const입니다에 this 따라서 모든 const Server*, 그리고 있음을 의미한다. 즉 groups.begin()iterator 대신 const_iterator을 반환합니다.

것은 당신 할 일이 (좋은 생각을하지 않을 수 있습니다, 당신은 정말 확인해야!) 할 수 그것의 바깥 쪽 개체가 const 경우에도 변경 될 수있는 mutablegroups을 표시하는 것입니다 :

mutable vector<T> groups; 

이렇게하면 groups.begin()이 일반 iterator을 반환합니다.

그러나 내가 대신 폼에서 개체의 일부를 반환하고 있기 때문에 변경 될 수 있으며, 따라서 당신은 정말 const을 존중하지 않는 것으로,이 방법은 모든 const을 선언 이유를 재평가하도록 요청할 것 .

+0

감사! 하지만 필자가 (당신이 Matching Id를 썼던) return * i를 쓸 때 한정자에 대한 에러가 발생합니다. – user3748682

+0

잘 작동합니다.어떤 오류가 발생합니까? 다른 일이 벌어지고있는 것 같아요. –

+0

내 게시물을 편집하고 관련 코드를 추가했습니다. – user3748682

관련 문제