vendredi 11 août 2017

Inserting into a std::map and manipulating the obtained iterator to the inserted element

I know that, if I insert a value into a std::map I can obtain an iterator referring to the inserted element (or the element which was previously there) by checking inserts return value like so:

std::map<int, char> m;
auto ret = m.insert(std::make_pair(1, 'A'))
if (ret.second)
    std::cout << "it worked" << std::endl;
// ... now iterations over the map starting at ret.first

However, I was wondering whether it is legal to manipulate the obtained iterator afterwards, e.g. assign the desired value in the case of a failure.

std::map<int, char> m;
auto ret = m.insert(std::make_pair(1, 'A'))
if (!ret.second)
    ret.first->second = 'A'; // assign the value in case it went wrong

I noticed that this seems to work, but I am not sure whether this is the desired behaviour since everything I found in case of an failed insertion was to use the operator[] instead. However this would not be a solution for me, because I need the iterator returned by insert afterwards and I can't use insert and the operator[] because of performance reasons.

Long story short: Is is valid to manipulate the data referenced by an iterator returned from std::maps insert()?

Aucun commentaire:

Enregistrer un commentaire