76

次のようなmap名前がありvalueMapます。

typedef std::map<std::string, std::string>MAP;
MAP valueMap;
...
// Entering data.

次に、このマップを参照によって関数に渡します。

void function(const MAP &map)
{
  std::string value = map["string"];
  // By doing so I am getting an error.
}

関数への参照として渡されるマップから値を取得するにはどうすればよいですか?

4

6 に答える 6

101

std::map::operator[]非 const メンバー関数であり、const 参照があります。

の署名を変更するか、次のことを行う必要がありfunctionます。

MAP::const_iterator pos = map.find("string");
if (pos == map.end()) {
    //handle the error
} else {
    std::string value = pos->second;
    ...
}

operator[]デフォルトで構築された値をマップに追加し、それへの参照を返すことにより、エラーを処理します。const 参照しかない場合、これは役に立たないため、別のことを行う必要があります。

プログラムロジックが何らかの方法でそれがすでにキーであることを保証している場合は、可能性を無視して と書くことができます。明らかな問題は、間違っていると未定義の動作が発生することです。string value = map.find("string")->second;"string"

于 2012-05-22T09:59:21.247 に答える
30

map.at("key")キーが見つからない場合は例外をスローします。

k がコンテナー内のどの要素のキーとも一致しない場合、関数は out_of_range 例外をスローします。

http://www.cplusplus.com/reference/map/map/at/

于 2014-01-13T07:12:11.337 に答える
0

ちょっと遅くなりましたが、私はまだ答えるつもりです.

template<class T1, class T2> class Bimap
{
std::map<T1, T2*> map1;
std::map<T2, T1*> map2;
public:
    void addRow(T1 &t1, T2 &t2){
        map1.insert(make_pair(t1, &t2));
        map2.insert(make_pair(t2, &t1));
    }
    T2* findForward(T1 t1){
        T2* value = map1.find(t1)->second;
        return value;
    }
    T1* findBackward(T2 t2){
        T1* value = map2.find(t2)->first;
        return value;
    }
};

クラスの使用:

//Init mapp with int,int
Bimap<int,int> mapp;

//Add a row(Record) in bimap
int a = 5;
int b = 7002;
mapp.addRow(a, b);

//Print a record
int *ans= mapp.findForward(a);
cout<<"Bimap Returned:"<<*ans<<endl;
于 2021-05-09T05:19:59.347 に答える