初始化1000个地图元素

时间:2012-06-08 20:02:41

标签: c++ dictionary std

正如我们可以将矢量初始化为:

  vector<int> var1(2000,1);

是否可以初始化地图;

  map<int, int>var2;

对于2000个变量......我想要初始化的原因是两个:

  1. 如果我将来访问某个元素,例如map [100] ..我想要那张地图[100] = 0
  2. 第二个原因是我使用的是一个最小优先级队列,用于比较时使用map的第二个值,即map [0] ... map [100]中存储的值。
  3. 我不想使用向量,因为我的指数确实是偏斜的,这导致了大量浪费的空间......即。我的索引是地图[0],地图[30],地图[56],地图[100],地图[120],地图[190]等。
  4. 我是否可以通过某种方式初始化地图,例如1000个变量...我也愿意使用任何其他数据结构。

    也是传统的初始化方法,即

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

    以上方式在我的情况下不起作用......还有其他方法。请帮助

    编辑:我不能用于循环:

    这样钥匙保持固定,我不想要,因为钥匙的分布是偏斜的。本质上,以这种方式申请循环与向量相同,我不想要

5 个答案:

答案 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