2017-11-09 8 views
-1

私は要素を格納するためにマップを使用していますが、このメモリを呼び出し側の関数に渡すことができるようなダイナミックマップメモリ​​を割り当てる必要がありますが、次のコードスニペットは私を混乱させます。ここを見てください。C++ Maps、これらの2つの宣言はどのように正しいのですか?

std :: map <int, int> map1; 
map1[some_integer_x] = some_integer_y; // OK at compilation. 

ただし、次のスニペットはOKではありません。エラーが発生します。ここで

std :: map <int, int> * map2 = new std :: map <int, int> 
map2[some_integer_x] = some_integer_y; // Not OK at compilation. 

はそれが私は、これはいくつかのポインタの問題に関連していることを理解することができますGCC 5.

error: no match for ‘operator=’ (operand types are ‘std::map<int, int>’ and ‘int’) 
map2[some_integer_x] = some_integer_y; 

で私を与えるエラーです。理由は何でしょうか?私の他の選択肢は何ですか?私はマップが大量の情報を含んでいるのでコピーを含まずに地図を渡したい。

+5

あなたのポインタ間接参照する必要は '(* MAP2)[some_integer_x]'ところで、あなたはおそらくする必要はありませんダイナミックマップ、あなたの使い方は何ですか? – Galik

+0

ああ、いいね。ありがとうございました。 –

+1

ところで、コピーを避けるために参照*でマップ*を渡すことができます。または、動的作成に頼らずにコピーを避けるために 'std :: move'を使ってマップを移動*移動*できます。 – Galik

答えて

3

map2は、mapへのポインタです。

std::map::operator[]にアクセスするには、オペレータ  *を使用してポインタを先に逆参照する必要があります。

[]*より高い演算子の優先順位を持っているので、それはマップのインスタンスであるかのように、あなたは

(*map2)[some_integer_x] = some_integer_y; 
1

を書く必要があるあなたは、マップへのポインタで動作しています。あなたは、以下の例のように、使用前にポインタを間接参照する必要があります。

#include <map> 
#include <iostream> 

int main() { 

    std :: map <int, int> map1; 
    map1[1] = 2; 
    std::map<int, int> *map2 = new std::map<int, int>(); 
    (*map2)[1] = 3; 
    std::cout << "Map1 at location 1 is: " << map1[1] << std::endl; //Prints 2 
    std::cout << "Map2 at location 1 is: " << (*map2)[1] << std::endl; // Prints 3 
    delete map2; 
} 
3

map2ので、その後operator[]std::map<int, int>の配列と同じように動作し、ポインタです。

ライン:

map2[some_integer_x] = some_integer_y; 

手段は、 "要素some_integer_xに移動し、それにsome_integer_yに価値を割り当てます"。

タイプmap2[some_integer_x]が整数値を割り当てようとしているため、これはタイプの不一致のコンパイルエラーを引き起こします。

だから、あなたはポインタを欽慕するために必要なすべての最初:

(*map2)[some_integer_x] = some_integer_y; 
+0

はい、map2 [0] [some_integer_x] = some_integer_yは動作します。 –

関連する問題