Re: Standard 23.1 - std::map::value_type must be assignable?
On Dec 30, 9:27 pm, massysett <OriginalOm...@gmail.com> wrote:
I'm puzzled about part of the standard. 23.1 states that items stored
in a container must be assignable. Therefore, the items in a map--that
is, std::pair<const Key, value> must be assignable. However, such a
pair--with the const Key--is not assignable.
not while they are in the associative container, that is.
My concern is more than academic; take for instance the following code
to make a copy of a map while eliminating some of the elements:
#include <map>
#include <algorithm>
typedef std::map<char, int> MapType;
bool predicate(const MapType::value_type& x)
{
return x.second > 1;
}
int main()
{
MapType bigMap;
bigMap['a'] = 1;
bigMap['b'] = 2;
MapType littleMap;
// This shouldn't work, right? Standard 23.1 says objects in
// container must be assignable, but MapType::value_type is
// std::pair<const char, int> which is NOT assignable
Sorry, I don't see any assignments.
Or did you think that copy construction is assignment?
its not, not even close.
std::remove_copy_if(bigMap.begin(),
bigMap.end(),
std::inserter(littleMap, littleMap.end()),
&predicate);
return 0;
}
This compiles fine on g++ 4.1.2, but I want to make sure I'm not
writing nonstandard code. That leaves me with two questions:
1) is there part of the standard that I'm missing that describes how
maps can have values of std::pair<const Key, value> even though that
pair is not assignable?
While the standard does require that Key to be assignable, it doesn't
mean that the map can store the pair as such. Basicly, you might need
to extract an item from the associative container(and remove it),
modify its key - and then reinserted it (letting the map reorder
according to the new key and the compare object to maintain weak
ordering).
Hence the key is assigneable, but not while its in the associative
container.
Imagine if you couldn't construct a
std::vector< Key > keys;
from a std::map< Key, Value > ? Thats what 23.1's statement is about.
2) is the sample code above standard compliant, and if not, how should
I accomplish something like this?
I see no problems with it as is, though it doesn't corralate with the
problem stated at the top.
Thanks,
Omari