正如我们可以将矢量初始化为:
vector<int> var1(2000,1);
是否可以初始化地图;
map<int, int>var2;
对于2000个变量......我想要初始化的原因是两个:
我是否可以通过某种方式初始化地图,例如1000个变量...我也愿意使用任何其他数据结构。
也是传统的初始化方法,即
map<int, int> m = map_list_of (1,2) (3,4) (5,6) (7,8);
以上方式在我的情况下不起作用......还有其他方法。请帮助
编辑:我不能用于循环:
这样钥匙保持固定,我不想要,因为钥匙的分布是偏斜的。本质上,以这种方式申请循环与向量相同,我不想要
答案 0 :(得分:1)
您可以使用代理而不是地图中的int
来执行此操作,如下所示:
#include <iostream>
#include <map>
using namespace std;
struct surrogate_int {
int val;
surrogate_int() : val(1) {}
surrogate_int& operator=(const int v) { val=v; }
operator const int() { return val; }
};
int main() {
map<int,surrogate_int> m;
m[5] = 5;
m[7] = 7;
m[9] = 9;
for (int i = 0 ; i != 10 ; i++) {
cout << i << ":" << m[i] << endl;
}
return 0;
}
答案 1 :(得分:0)
你可以采用旧的方式使用循环:
map<int, int> var2;
for (int = 0; i < 1000; ++i) {
var2[i] = 0;
}
另一方面,如果地图中不存在该键,那么下标符号(var2[x]
)将使用其默认值(int
为0)添加该值。
答案 2 :(得分:0)
您可能希望定义自己的具有嵌入优先级的数据类型(默认为默认值为0),并定义使用该优先级对您的类型对象进行排序的比较器。像
这样的东西class MyType {
int val;
int priority;
MyType(int val, int priority = 0): val(val), priority(priority) {}
bool operator<(MyType const& other) { return priority < other.priority; }
}
然后你可以创建一个这种类型的优先级队列,完全避免使用地图。
答案 3 :(得分:0)
升压::分配:
///来自http://www.boost.org/doc/libs/1_35_0/libs/assign/doc/index.html
#include <boost/assign/list_inserter.hpp> // for 'insert()'
#include <boost/assert.hpp>
#include <string>
using namespace std;
using namespace boost::assign; // bring 'insert()' into scope
{
map<string,int> months;
insert( months )
( "january", 31 )( "february", 28 )
( "march", 31 )( "april", 30 )
( "may", 31 )( "june", 30 )
( "july", 31 )( "august", 31 )
( "september", 30 )( "october", 31 )
( "november", 30 )( "december", 31 );
BOOST_ASSERT( months.size() == 12 );
BOOST_ASSERT( months["january"] == 31 );
}
答案 4 :(得分:0)
您根本不需要做任何事情。当您使用 operator[]
访问以前未插入的密钥时,将创建一个新值,初始化为0并返回一个引用。根本不需要初始化。
另外n 注意,当你将元素插入地图时,键是固定的,所以如果你决定插入100个元素,那么键将被修复,这将使初始化在大多数用例中都没用。
我会避免初始化地图的复杂性,而是使用一个帮助函数替换operator[]
:
int &getValue( std::map<int,int>& m, int key ) {
return *m.insert( std::make_pair(key,1) ).first;
}
无需预先分配节点。诀窍是如果值已经存在于地图中,insert
等效于查找,但如果元素不存在则会添加该元素。尝试插入pair<int,int>(key,1)
会将1
插入到容器中(如果之前不存在),但如果该值已经存在则会保持不变。因为insert
返回迭代器,我们可以使用它来获取对存储值的引用。
使用只是就像通过operator[]
访问一样简单:
int x = getValue( mymap, 31 ); // 1 if 31 was not present in the map, else
// the value stored there.
getValue(mymap,31) = 5; // Ugly, I know... but still simpler than providing
// an extra type, and preinitializing the container