Почему std :: remove не работает с std :: set?

Следующий код:

#include <iostream>
#include <set>
#include <algorithm>

std::set<int> s;

int main()
{
s.insert(1);
s.insert(2);

std::remove(s.begin(), s.end(), 1);
}

не компилируется с gcc 4.7.2:

$ LANG=C g++ test.cpp
In file included from /usr/include/c++/4.7/algorithm:63:0,
from test.cpp:3:
/usr/include/c++/4.7/bits/stl_algo.h: In instantiation of '_FIter std::remove(_FIter, _FIter, const _Tp&) [with _FIter = std::_Rb_tree_const_iterator<int>; _Tp = int]':
test.cpp:12:38:   required from here
/usr/include/c++/4.7/bits/stl_algo.h:1135:13: error: assignment of read-only location '__result.std::_Rb_tree_const_iterator<_Tp>::operator*<int>()'

Итак, я пошел к определению fset::iterator и я нашел это в реализации GCC (файл ../c++/4.7/bits/stl_set.hот 125):

  // _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;
typedef typename _Rep_type::const_iterator            const_iterator;
typedef typename _Rep_type::const_reverse_iterator    reverse_iterator;
typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
typedef typename _Rep_type::size_type                 size_type;
typedef typename _Rep_type::difference_type           difference_type;

Почему оба определения постоянны? Почему мой (довольно простой) код не работает?

7

Решение

std::set заказан контейнер, пока std::remove изменяет порядок элементов в контейнере, размещая элементы, которые должны быть удалены до конца, поэтому его нельзя использовать с упорядоченными контейнерами, где порядок элементов определяется предикатом. Вам необходимо использовать:

s.erase( 1);

Удалить 1 из набора.

15

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]