Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ std::set update is tedious: I can't change an element in place

Tags:

c++

set

stl

I find the update operation on std::set tedious since there's no such an API on cppreference. So what I currently do is something like this:

//find element in set by iterator Element copy = *iterator; ... // update member value on copy, varies Set.erase(iterator); Set.insert(copy); 

Basically the iterator return by Set is a const_iterator and you can't change its value directly.

Is there a better way to do this? Or maybe I should override std::set by creating my own (which I don't know exactly how it works..)

like image 233
Figo Avatar asked Feb 07 '10 18:02

Figo


People also ask

How do I change an element in a set in C++?

There are probably a few duplicates of that question but you can't replace an item in a set. You have to remove the old item and add the new item. It's not too hard. c++ provide basic functionalities which can be used to form several others like replace --> remove old + add new .

Is set in C++ mutable?

Modifications that do not break the sorting order are changes in those parts of the contained elements that do not contribute to the sorting order. The C++ Standard does not specify whether the iterator of a set container (type set<T>:: iterator) is a mutable or immutable iterator.


1 Answers

set returns const_iterators (the standard says set<T>::iterator is const, and that set<T>::const_iterator and set<T>::iterator may in fact be the same type - see 23.2.4/6 in n3000.pdf) because it is an ordered container. If it returned a regular iterator, you'd be allowed to change the items value out from under the container, potentially altering the ordering.

Your solution is the idiomatic way to alter items in a set.

like image 167
Terry Mahaffey Avatar answered Oct 13 '22 11:10

Terry Mahaffey