2012-11-21 3 views
2

나는 다중 세트를 가지고 있으며 그 범위를 얻고 있습니다. 나중에 그것을 사용하는 벡터에이 범위를 추가 할이 내가 뭘하는지입니다 :std :: vector에 반복자 범위 삽입하기

class foo 
{ 
    public: 
     int a; 
     foo(int a) : a(a){} 
}; 
class FooPointerCompare 
{ 
    public: 
     bool operator()(const foo* a, const foo* b) 
     { 
      return a->a < b->a; 
     } 
}; 

std::multiset<foo*, FooPointerCompare> m; 
std::vector<std::multiset<foo*, FooPointerCompare>::iterator> v; 
auto pair = m.equal_range(new foo(5)); //leak here, I know 
v.insert(v.end(), pair.first, pair.second); 

그러나 나는 이러한 오류를 얻을 : 나는 간단한 for(auto it = pair.first; it != pair.second; it++) v.push_back(it);를 사용할 때

No matching constructor for initialization of 'std::__1::__tree_const_iterator<foo *, const std::__1::__tree_node<foo *, void *> *, int>' 

No viable overloaded '=' 

가 작동을 아주. 내 vector::insert 전화에 무엇이 문제가 있습니까? 잘못 무엇

+0

Btw,'foo f (5);를 쓰는 것이 더 쉽습니다. auto pair = m.equal_range (&f);''여기에 누설, 알고있어 라 ';-p –

+0

@SteveJessop true : P, 실제 코드에서 스마트 포인터를 사용했지만 로컬 객체에 대한 참조 –

답변

3

v.insert(v.end(), pair.first, pair.second); 

는 당신의 의도와 동일하지 않습니다

for (auto it = pair.first; it != pair.second; ++ it) 
    v.push_back(*it); 
//   ^

에 해당한다는 것이다. 나는 당신이 원하는 것을하기위한 표준 알고리즘이 없다고 생각합니다. for 루프를 작성하는 것이 좋습니다.

+0

아, 그 말이 완벽합니다! 도와 줘서 고마워. –

3

vector::insert은 벡터에 삽입 할 값을 가리키는 반복자를 예상합니다.

반복기의 벡터가 있으므로 반복기를 반복하는 내용을 전달해야합니다. 그러나 당신은 당신의 다중 집합에있는 요소들에 대해 반복하는 것을 통과시키고 있습니다.

std::vector<char*> v; 
char foo[10]; 
v.insert(v.end(), foo, foo+10); 

또는 :

그래서, 이것은 당신이 할 수 없어 같은 이유로 실패 할 세 가지 문제에

std::vector<int> v; 
v.insert(v.end(), 0, 10); 

하나의 솔루션이 boost::counting_iterator입니다. 귀하의 경우 :

v.insert(v.end(), 
    boost::make_counting_iterator(pair.first), 
    boost::make_counting_iterator(pair.second) 
); 
관련 문제