当我有一个std :: map时,是否有一种优雅的方式同时出现:
我发现阻止在地图中进行2次查找的最佳方法是:
std::map<int, int> myMap;
//do some stuff with the map
std::map<int,int>::iterator it = myMap.insert(std::pair<int, int>(0,0)).first;
it->second = 0; //necessary because insert does not overwrite the values
是否可以在单个语句/行中执行这两项操作? 感谢
答案 0 :(得分:4)
唉,STL功能和容器并不总能达到预期效果。这是两个通用版本,第一个更像上面的代码:
template<class Map>
inline typename Map::iterator ForceInsert1(
Map& m,
const typename Map::key_type& k,
const typename Map::data_type& d )
{
typename Map::iterator it = m.insert(
typename Map::value_type( k, d ) ).first;
it->second = d; // only necessary if the key already exists
return it;
}
template<class Map>
inline typename Map::iterator ForceInsert2(
Map& m,
const typename Map::key_type& k,
const typename Map::data_type& d )
{
typename Map::iterator it = m.find( k );
if( it != m.end() )
{
it->second = d;
}
else
{
it = m.insert( typename Map::value_type( k, d ) ).first;
}
return it;
}
typedef std::map<int, int> MyMap;
void Foo( MyMap& myMap )
{
ForceInsert1( myMap, 42, 100 );
ForceInsert2( myMap, 64, 128 );
}
答案 1 :(得分:1)
你可以这样做:
map<int, int> m;
map<int, int>::iterator iter;
(iter = (m.insert(make_pair(1,1))).first)->second = 5;
显然make_pair
中的第二个值是无关紧要的(只要它是正确的类型)。在这里,您可以将迭代器指向的值设置为5。
有点厚颜无耻,从技术上讲,这也是一个声明:
iter = myMap.insert(make_pair(0,0)).first, iter->second = 0;
逗号(,
)运算符保证在计算rhs之前发生所有副作用,因此iter
具有正确的值
答案 2 :(得分:1)
如果您只想要价值而不是货币对:
int& value = myMap[0] = 0;
答案 3 :(得分:0)
myMap[0] = 0;
如果该行不存在,则该行将插入一个值为0的值,并且在任何一种情况下,它都会将该键的值设置为0.
这与你所拥有的大致类似,可以分成一行:
myMap.insert(std::make_pair(0,0)).first->second = 0;