如何将std::map
中的所有值设置为相同的值,而不使用遍历每个值的循环?
答案 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("")));