3

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

  vector<int> var1(2000,1);

是否可以初始化地图;

  map<int, int>var2;

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

  1. 如果我将来访问一个元素,例如 map[100]..我想要那个 map[100]=0
  2. 第二个原因是我使用了一个最低优先级队列,它使用 map 的第二个值进行比较,即存储在 map[0]...map[100] 中的值。
  3. 我不想使用向量,因为我的索引确实偏斜,这会导致大量空间浪费......即我的索引是 map[0]、map[30]、map[56]、map[100]、地图[120]、地图[190]等

有什么方法可以为 1000 个变量初始化映射...我也愿意使用任何其他数据结构。

也是初始化地图的传统方式,即

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

上述方法在我的情况下不起作用......还有其他方法吗?请帮助

编辑:我不能使用 for 循环:

这样,由于我的密钥分布是倾斜的,因此我不想要密钥保持固定。本质上以这种方式应用for循环与vector相同,这是我不想要的

4

5 回答 5

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;
}
于 2012-06-08T20:14:17.430 回答
0

您可以使用循环的老式方法:

map<int, int> var2;
for (int = 0; i < 1000; ++i) {
  var2[i] = 0;
}

另一方面,如果该键在地图中尚不存在,则使用下标符号 ( var2[x]) 将添加该值及其默认值 (0 表示)。int

于 2012-06-08T20:05:39.727 回答
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; }
}

然后,您可以创建该类型的优先级队列,完全避免使用映射。

于 2012-06-08T20:21:10.803 回答
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 );
} 
于 2012-06-08T20:23:15.680 回答
0

你根本不需要做任何事情。当您用于operator[]访问以前未插入的键时,会创建一个新值,初始化为 0 并返回一个引用。根本不需要初始化。

请注意,当您将元素插入地图时,键是固定的,因此如果您决定插入 100 个元素,则键将是固定的,这在大多数用例中会使初始化无用。

我会避免初始化地图的复杂性,而是有一个辅助函数替换operator[]为:

int &getValue( std::map<int,int>& m, int key ) {
    return *m.insert( std::make_pair(key,1) ).first;
}

无需预先分配节点。诀窍是insert如果该值已存在于地图中,则相当于查找,但如果该元素不存在,则将添加该元素。如果之前不存在,尝试插入 apair<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
于 2012-06-08T20:25:25.540 回答