Наборы и карты сохраняют элементы в порядке согласно условию сортировки. Чтобы код пользователя не нарушал инварианты, key
карты и весь элемент в наборе должны быть постоянными. Ваша проблема в том, что хранимый элемент не SmallObject
, а const SmallObject
.
Если бы это не было ограничено, вы могли бы иметь:
int init[] = { 1, 2, 3, 4, 5 };
std::set<int> values( init, init+5 );
std::copy( values.begin(), values.end(),
std::ostream_iterator<int>(std::cout, " "));
// 1 2 3 4 5
*(values.find(3)) = 5; // luckily this does not work!
std::copy( values.begin(), values.end(),
std::ostream_iterator<int>(std::cout, " "));
// 1 2 5 4 5 -- not in order!!!
Проблема не только в том, что теперь элемент набора будет не в порядке, но и в том, что в зависимости от того, как было построено дерево, могут быть элементы, которые присутствуют в наборе, но не могут быть найдены.