2010-08-22 3 views
2

중첩 세트가 있지만 중첩 세트에 요소를 삽입 할 수 없습니다.중첩 된 stl 세트에 요소를 삽입 할 수 없습니다

std::set<std::set<int> > centre_as_set = bitset_to_set(centre->second->bit_partitions); 
std::set<std::set<int> >::iterator set_itr; 
for (set_itr = centre_as_set.begin(); set_itr != centre_as_set.end(); ++set_itr) { 
    set_itr->insert(4); 
    std::set<int>::iterator node_itr; 
    for (node_itr = set_itr->begin(); node_itr != set_itr->end(); ++node_itr) { 
      std::cout << *node_itr; 
     } 
    } 
} 

오류가 나는 확실히 그 템플릿 오류, 감사 어떤 도움을 해독 할 수

Partition_standalone.cpp:612: error: passing ‘const std::set, std::allocator >’ as ‘this’ argument of ‘std::pair, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = int, _Compare = std::less, _Alloc = std::allocator]’ discards qualifiers

입니다.

답변

0

편집 :이 대답은 georg의 의견과 다릅니다.

는 여기 컴파일러를 해달라고하지만, 표준의 전체 선언 :: 설정은 다음과 같습니다 가장 바깥 쪽 세트의

template < class Key, class Compare = less<Key>, 
      class Allocator = allocator<Key> > class set; 

은 "키" "표준 : : 세트"입니다. Comparator는 "std :: less>"또는 짧은 "연산자 < (set, set)"이며 정의되지 않았습니다. 컴파일러는 비교기의 첫 번째 사용/인스턴스화시에만 이에 대해 경고합니다.

나는 std :: set의 유용한 순서/비교기가 없다고 생각한다. 당신은 std :: vector를 사용하는 것이 더 낫다. 어떤 요소를 정렬시키지 않고 비교자를 필요로하지 않는다.

아, 순서에 영향을 줄 경우 (런타임에) 설정 키를 변경할 수 없습니다. 하지만 그것은 런타임 오류가 아니라 컴파일 오류입니다.

+3

'연산자'가 있습니다. [여기] (http://www.cplusplus.com/reference/stl/set/operators/). –

+0

런타임 오류가 아니며 컴파일 오류이므로 문제가됩니다. – SoapBox

+1

틀린 게시물을 삭제할만한 가치가 있습니까? –

5

집합의 요소는 변경할 수 없으므로 conststd::set<int> 인스턴스에서 비 const 멤버 함수 insert()을 사용하려고합니다. 이 당신이 stl_set.h의 선언에 iterator 기호에 따라 경우 다음과 같은 좋은 의견은 다음과 같습니다

// _GLIBCXX_RESOLVE_LIB_DEFECTS 
// DR 103. set::iterator is required to be modifiable, 
// but this allows modification of keys. 
typedef typename _Rep_type::const_iterator iterator; 

C++ 98과 C++ 03 수 수정, 그러나 이것은 결함이 이미 비 고대 GCC에 고정 버전 및 VC10. 언급 된 결함 보고서는 here이며 다음 표준에 통합됩니다.

예 : 4 값을 추가하는 대신 다음과 같은 값을 입력하십시오.

// Readability: 
typedef std::set<int> IntSet; 
typedef std::set<IntSet> IntSetSet; 

// Helper: 
IntSetSet add_value_to_sets(const IntSetSet& in, int i) { 
    IntSetSet ss; 
    IntSetSet::iterator set_itr; 
    for (set_itr = in.begin(); set_itr != in.end(); ++set_itr) { 
     IntSet s = *set_itr; 
     s.insert(4); 
     ss.insert(s); 
    } 
    return ss; 
} 

// ... 
IntSetSet centre_as_set = 
    add_value_to_sets(bitset_to_set(centre->second->bit_partitions), 4); 
+0

Ow. 나는이 glibcxx 기능을 좋아하는지 모른다. 이렇게하면 변경 내용이 주문에 영향을 미치지 않더라도 설정 내용을 효과적으로 변경할 수 없습니다. 예 : 비교되지 않는 속성 변경. –

+2

이것이 유용한 유스 케이스의 대부분은'std :: map'과 같은 연관 컨테이너에 더 잘 적용된다고 말할 수 있습니다. 나를 위해 그것은 실수로 모든 것을 런타임에 깨뜨리는 것보다 낫다. –

관련 문제