在std :: map中设置所有值

时间:2020-03-06 14:46:56  来源:igfitidea点击:

如何在不使用循环遍历每个值的情况下将" std :: map"中的所有值设置为相同的值?

解决方案

C ++具有<algorithm>中的fill方法,但这不适用于地图。实际上,对关联容器的算法支持通常不是很好。

结果,我们将不得不使用一个交互或者编写一个适当的仿函数以与for_each一起使用(但我认为这是不必要的开销):

template <typename TKey, typename TValue>
struct resetter : public std::unary_function<std::pair<TKey, TValue> > {
    TValue const value;

    public resetter(value const& v) : value(v) { }

    public void operator ()(std::pair<TKey, TValue>& v) {
        v.second = value;
    }
};

for_each(map.begin(), map.end(), resetter<Key, Value>(value));

boost :: assign库具有各种巧妙的东西,可以帮助初始化容器的内容。我认为可以将其用于避免显式遍历地图。不幸的是,地图是很难初始化的奇怪的野兽,因为密钥必须是唯一的。最重要的是,简单的for循环可能是初始化映射的最佳方法。它可能不是超级优雅,但是它可以完成工作,并且任何熟悉STL的人都可以立即理解。

map <int,string> myMap;
for( int k=0;k<1000;k++)
  myMap.insert(pair<int,string>(k,string("")));

这篇文章的其余部分描述了我达到上述结论所经历的旅程。

通过boost :: assign可以轻松为地图分配少量值。

map<string,int> m; 
insert( m )( "Bar", 1 )( "Foo", 2 );

或者

map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);

在情况下,如果要使用相同的值初始化整个映射,则有实用程序repeat和repeat_fun。
这样的事情应该适用于多图(未经测试的代码片段)

pair<int,string> init( 0,string(""));
multimap <int,string> myMap = repeat(1000,init);

正如Konrad Rudolph指出的那样,我们不能使用相同的精确值初始化地图,因为键必须是唯一的。

这使生活变得更加复杂(有趣吗?)。可能是这样的:

map <int,string> myMap;

struct nextkey
{
   int start;
   nextkey( s ) : start( s ) {}
   pair<int,string> operator () ()
{
   return pair<int,string>(start++,string(""));
}
};

myMap = repeat_fun(1000,nextkey(0));

现在,这变得非常复杂,我现在认为简单的迭代是可行的方法

map <int,string> myMap;
for( int k=0;k<1000;k++)
  myMap.insert(pair<int,string>(k,string("")));