0

私は次のような地図を持っています typedef map<int32_t,std::vector<int32_t>> myMap

次のようなキーに関してベクトルに値を追加しました

myMap[somePointer->getVal()].push_back(Id1);
myMap[somePointer->getVal()].push_back(Id2);
myMap[somePointer->getVal()].push_back(Id3);
myMap[somePointer->getVal()].push_back(Id4);

キーのベクトルから値を削除したい場合はどうすればよいですか? やってみた myMap[somePointer->getVal()].erase(Id1)

しかし、このコンパイラではエラーが発生します。

4

4 に答える 4

1

x+1番目の要素を削除するには、これを試してください

myMap[somePointer->getVal()].erase (myMap[somePointer->getVal()].begin()+x);

于 2013-09-25T12:54:08.487 に答える
0

ベクトルはルックアップ用に設計されていないため、インターフェイスは値に基づいていません。ベクトルから消去したい場合は、その場所を知る必要があります。良い点は、標準のアルゴリズムを使用して場所を取得できることです。コードに相当するものは次のとおりです。

auto& vector = myMap[somePointer->getVal()];
auto it = std::find(vector.begin(), vector.end(), Id1);
if (it != vector.end()) { vector.erase(it); }

ご覧のとおり、オリジナルよりも少し長く、複雑になっています。ベクトル内に要素の位置がある場合 (つまり、最初/最後/n 番目の要素を消去したいことがわかっている場合) 、および反復子演算std::findによって得られた正しい反復子を に置き換えることができます。begin()end()

于 2013-09-25T13:03:52.183 に答える
0

C++98 または C++11 の場合、 にeraseは 3 つのオーバーロードされた形式があります

C+98

void erase (iterator position);
size_type erase (const key_type& k);
void erase (iterator first, iterator last);

C++11

iterator  erase (const_iterator position);
size_type erase (const key_type& k);
iterator  erase (const_iterator first, const_iterator last);

したがって、次のように2番目の形式を使用して削除する必要があります

myMap.erase(somePointer->getVal()); // getVal() must return a type convertible to maps key_type

それ以外の

myMap[somePointer->getVal()].erase(Id1)
于 2013-09-25T13:04:01.737 に答える
0

documentationから、シノプシスは次のとおりです。

C++98:

iterator erase (iterator position);
iterator erase (iterator first, iterator last);

C++11:

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

したがって、イテレータを指定する必要があります。

it = myMap[somePointer->getVal()].begin() + index;
myMap[somePointer->getVal()].erase(it)

これを使用することもできますmultimap

于 2013-09-25T12:54:13.470 に答える