I'm trying to create a map inside a map:
typedef map<float,mytype> inner_map; typedef map<float,inner_map> outer_map;
Will I be able to put something inside inner map, or does iterator::second returns a copy?
stl_pair.h suggests the latter:
74: _T2 second; ///< @c second is a copy of the second object
but my test program run fine with the code like this:
it = my_map.lower_bound(3.1415); (*it).second.insert(inner_map::value_type(2.71828,"Hello world!");
So where is the truth? Is this a copy or not?
C++ Iterators Map Iterator An iterator to the first element in the container. If a map object is const-qualified, the function returns a const_iterator . Otherwise, it returns an iterator .
Yes -- when you insert an item into an std::map, you pass it by value, so what it contains is a copy of what you passed.
Return Value: The function returns an iterator or a constant iterator which refers to the position where the key is present in the map. If the key is not present in the map container, it returns an iterator or a constant iterator which refers to map. end().
std:: map stores unique keys only in sorted order based on chosen sorting criteria. It's easy and faster to search for elements using the key. Only one element is attached to each key. std::map can be used as an associative array.
I want to add a follow up answer to this question for people using C++11 iterators...
The following code:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}}); for (auto i : m) { std::cout << i.first << ": " << i.second << std::endl; }
does copy the key and value since "auto" is a value by default, not a const reference (at least that's how it behaves clang 3.1).
Additionally, the code:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}}); for (const std::pair<std::string,std:string>& i : m) { std::cout << i.first << ": " << i.second << std::endl; }
also copies the key and value since the correct code should be:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}}); for (const auto& i : m) { std::cout << i.first << ": " << i.second << std::endl; }
or
std::map<std::string, std::string> m({{"a","b"},{"c","d"}}); for (const std::pair<const std::string,std:string>& i : m) { std::cout << i.first << ": " << i.second << std::endl; }
The comment in stl_pair.h
is misleading in this specific case.
There will be no copy, since the map::iterator
actually refers to the original data inside the map (the value_type
, which itself is a pair
), it’s not a copy. Thus iterator::second
also refers to the original data.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With