Невозможно вставить элемент во вложенный набор целых чисел - PullRequest
2 голосов
/ 22 августа 2010

У меня есть вложенный набор целых, но я не могу вставить элементы во вложенные наборы.

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: ошибка: передача const std :: set, std :: allocator> ’ в качестве «этого» аргумента ‘Std :: pair, _Compare, имяТипа _Alloc :: повторного связывания <_key> :: другого> :: const_iterator, bool> std :: set <_Key, _Compare, _Alloc> :: insert (const _Key &) [с _Key = int, _Compare = std :: less, _Alloc = std :: allocator] 'Discards классификаторы

Я не могу расшифровать эту ошибку шаблона, любая помощь приветствуется.

Ответы [ 2 ]

5 голосов
/ 22 августа 2010

Элементы в наборе не являются изменяемыми, и вы пытаетесь использовать неконстантную функцию-член insert() для const экземпляра std::set<int>. Если вы следите за символом iterator к его объявлению в stl_set.h, есть следующий хороший комментарий:

// _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. Упомянутый отчет о дефектах можно найти здесь и будет включен в следующий стандарт.

Используйте, например, вместо этого добавьте что-то вроде следующего: 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 голосов
/ 22 августа 2010

Редактировать: этот ответ неверен согласно комментарию Георга.

У меня нет компилятора здесь, но полное объявление std :: set:

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

"Ключ" внешнего набора - "std :: set". Компаратор является "std :: less>" или коротким оператором <(set, set) ", который не определен. Компилятор предупреждает об этом только при первом использовании / создании экземпляра компаратора. </p>

Я не думаю, что есть полезный упорядочиватель / компаратор для std :: set. Вам лучше использовать std :: vector, который не упорядочивает элементы и не нуждается в компараторе.

О, и не разрешается изменять (во время выполнения) установленные ключи, если это повлияет на порядок. Но это будет ошибка времени выполнения, а не ошибка компиляции.

...