设置std :: map中的所有值

时间:2008-09-26 12:57:40

标签: c++ stl

如何将std::map中的所有值设置为相同的值,而不使用遍历每个值的循环?

3 个答案:

答案 0 :(得分:13)

C ++具有来自fill的{​​{1}}方法,但这对地图不起作用。实际上,对关联容器的算法支持通常不好。

因此,您必须使用交互或编写适当的函子与<algorithm>一起使用(但我认为这是不必要的开销):

for_each

答案 1 :(得分:3)

我遇到了同样的问题,但发现boost :: adapters :: values返回的范围是可变的,因此它可以与普通算法一起使用,例如std :: fill。

#include <boost/range/adaptor/map.hpp>
auto my_values = boost::adaptors::values(my_map);
std::fill(my_values.begin(), my_values.end(), 123);

答案 2 :(得分:2)

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。
这样的东西应该适用于multimap(未经测试的代码片段)

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("")));