3

ベクトルを次のように初期化できるのと同じように:

  vector<int> var1(2000,1);

マップを初期化することは可能ですか?

  map<int, int>var2;

2000 個の変数の場合...初期化する理由は 2 つあります。

  1. 将来的に要素にアクセスする場合に備えて、たとえば map[100]..map[100]=0 が必要です
  2. 2 番目の理由は、比較のために map の 2 番目の値、つまり 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

組み込みの優先度 (デフォルトではおそらく 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

ループを使用する昔ながらの方法を実行できます。

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

一方、下付き文字表記 ( ) を使用すると、キーがまだマップに存在しない場合、var2[x]デフォルト値 ( の場合は 0) で値が追加されます。int

于 2012-06-08T20:05:39.727 に答える
0

何もする必要はありません。operator[]以前に挿入されていないキーにを使用してアクセスすると、新しい値が作成され、0 に初期化されて参照が返されます。初期化する必要はまったくありません。

また、要素をマップに挿入するとキーが固定されることに注意してください。したがって、100 個の要素を挿入するとキーが固定され、ほとんどのユースケースで初期化が役に立たなくなります。

マップの初期化の複雑さを回避し、次のように置き換えるヘルパー関数を用意しますoperator[]

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

ノードを事前に割り当てる必要はありません。トリックはinsert、値がマップに既に存在する場合はルックアップと同等ですが、存在しない場合は要素を追加します。a の挿入を試みると、コンテナーが以前に存在しなかった場合はコンテナー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
于 2012-06-08T20:25:25.540 に答える