序文
、もはや完全なレコードは、知識だけの一部に使用し、この問題に焦点を当てていない効率を向上させるためになるような質問のITPシリーズは、単に、使用量ベースを理解します
タイトル
ポータル:ITP2_8_D:マルチ地図
解決
使い方
マルチマップのほぼ同じマップが、差はキーが複数の値に対応することができるマルチマップ、ということであるキーマップのみに対応する値、
検索()メソッドとマップが異なる、マルチマップの検索()メソッドは、条件の全てを満足しますランダム要素反復子が要素を返す
イテレータ結合よりも小さくない()メソッドは、単に最初の要素へのポインタを返すLOWER_BOUND記載される方法を参照する場合、実際の使用ではLOWER_BOUNDによって挿入の順序との関係を持っているようです()UPPER_BOUND、及び()は、キーに対応するすべての要素を横断することができ、オーダーがトラバースされる。
一般的に使用される方法は、(のみ同じ被験体についての現時点で)前に参照マップマルチマップ従来の方法で、上に直接運ば
メソッド名 | 説明 | 例 |
---|---|---|
挿入((キー、ヴァル)) | マルチマップ要素(キー、ヴァル)に挿入 | my_map.insert(make_pair(キー、ヴァル)); |
消去(キー) | 鍵となる要素をドロップ | my_map.erase(キー); |
(キー)を見つけます | 検索キーと一致する要素、および戻り複数の要素がランダムに存在する場合、反復子をその要素を返し、そうでない場合、戻り端イテレータの終点() | それはmy_map.find(キー)=マップの<string、int型> ::イテレータ。 |
LOWER_BOUND(キー) | イテレータへのポインタを返すには、最初の重要な要素未満ではありません | IT1 = my_map.lower_bound(キー)。 |
UPPER_BOUND(キー) | 最初の重要な要素へのポインタを返すことはイテレータよりも大きく、 | IT2 = my_map.upper_bound(キー)。 |
カウント(キー) | 重要な要素と一致するキーの数を返します。 | IF(my_map.count(キー)){...} |
equal_range(キー) | 所定の範囲の重要な要素、2回の反復子に定義された範囲のように容器に戻しました。 | 対<マルチマップ<文字列、整数> ::イテレータ、マルチマップ<文字列、整数> ::イテレータ>範囲= my_map.equal_range(キー)。 |
コーディング
STLの独自のコードを使用してみてください
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
int q, com, x;
string key, L, R;
multimap<string, int> my_map;
multimap<string, int>::iterator it1, it2, it;
cin >> q;
while (q--) {
cin >> com >> key;
switch (com) {
case 0:
cin >> x;
my_map.insert(make_pair(key, x));
break;
case 1:
it1 = my_map.lower_bound(key);
it2 = my_map.upper_bound(key);
for (it = it1; it != it2; it++) {
cout << it->second << endl;
}
break;
case 2:
my_map.erase(key);
break;
case 3:
L = key;
cin >> R;
it1 = my_map.lower_bound(L);
it2 = my_map.upper_bound(R);
for (it = it1; it != it2; it++) {
cout << it->first << " " << it->second << endl;
}
break;
}
}
}
その他には、STLのコードを使用します
#include <bits/stdc++.h>
using namespace std;
int main() {
int num_query; cin >> num_query;
multimap<string, int> dic;
while (num_query--) {
int command; scanf("%d", &command);
char key[20]; scanf("%s", key);
switch (command) {
case 0:
int value; scanf("%d", &value);
dic.insert(make_pair(key, value));
break;
case 1:
{
pair<multimap<string, int>::iterator, multimap<string, int>::iterator>
range = dic.equal_range(key);
while (range.first != range.second) {
printf("%d\n", range.first -> second);
range.first++;
}
break;
}
case 2:
dic.erase(key);
break;
case 3:
char key2[20]; scanf("%s", key2);
multimap<string, int>::iterator it = dic.lower_bound(key);
multimap<string, int>::iterator last = dic.upper_bound(key2);
while (it != last) {
printf("%s %d\n", ((*it).first).c_str(), (*it).second);
it++;
}
break;
}
}
}
記録
:この方法は、()は次のように説明されている同じキー要素をEqual_range
。レンジのコンテナで指定したキーを持つすべての要素を含む範囲は2回の反復子、最後のキーと別のポインティング以内小さくない最初の要素を一つのポインティングによって定義されます返します第一の要素にキーよりも大きい。また、最初の反復子がLOWER_BOUND()を用いて得られ、そしてUPPER_BOUNDと第二することができる()。
容器を返す与えられた範囲のすべての主要な要素を有しています。範囲を定義された2つの反復子は、キーポイントは、最初の要素以上である、第一の点は、他の重要な要素よりも大きいです。最初の反復では)(LOWER_BOUNDに切り替えることができる得られ、第二の反復子はUPPER_BOUND切り替えることができ、()が得られます。