いつも大変、お世話になっております。
multimapのキーの収集方法についてお知恵をお貸しください。
以下の簡単なサンプルで説明しますと、
// test2.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include stdafx.h
#include <map>
#include <string>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
multimap<string, string>* m = new multimap<string, string>;
vector<string> keys;
m->insert(pair<string, string>(a, データ1));
m->insert(pair<string, string>(a, データ2));
m->insert(pair<string, string>(a, データ3));
m->insert(pair<string, string>(b, データ4));
m->insert(pair<string, string>(b, データ5));
m->insert(pair<string, string>(b, データ6));
m->insert(pair<string, string>(c, データ7));
m->insert(pair<string, string>(c, データ8));
m->insert(pair<string, string>(c, データ9));
delete m;
return 0;
}
というソースで、mのキーを収集し、keysにa,b,cという風に格納したいのですが何
かよい方法はあるものでしょうか?
よろしくお願い致します。
すみません。もう少し補足させて頂きます。
multimapにおけるKeyのループとValueのループを構成したいのです。
valueのループはequal_eange()で出来ることは分かったのですが、Keyをどうやってルー
プさせればよいか考えているところです。
よろしくお願い致します。
>というソースで、mのキーを収集し、keysにa,b,cという風に格納したいのですが何
>かよい方法はあるものでしょうか?
>
>multimapにおけるKeyのループとValueのループを構成したいのです。
>valueのループはequal_eange()で出来ることは分かったのですが、Keyをどうやってルー
>プさせればよいか考えているところです。
御免なさい仰っている事が良く分かりません。
1)Key のループって何ですか?
2)Value のループって何ですか?
3)Key をループさせるってどういうことがしたいんでしょうか?
keys に m のキー値が洩れなくすべて収まるようにしたいというわけですね?
マップを使うと決めた時点で、マップを使う側はキー値に付いて知識があるという前提が
有るとは思うのですが、取敢えずマップからキー値を拾ってみましょう
イテレーターで m 全体を走査して、キーになる要素の値を読めばいいでしょう
重複して登録してもいいのなら、見つけたキー値を、 keys に push_back しましょう
重複して登録したくなければ、別途マップを用意してキーが登録済みかどうか検査しましょう
未登録ならキーをマップと keys とに登録してしまいましょう
これを繰り返せばキーの一覧が出来ている事でしょう
重複して keys に登録した場合、後ろから順に見ていって、値が変るまで削除していけば
重複はなくなるはずですね
keysを、vector<string> ではなく、
set<string> にすれば、
単に、multimapのiteratorをまわしてinsertしていくだけでいいと思います。
#include <map>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
multimap<string, string>* m = new multimap<string, string>;
vector<string> keys;
m->insert(pair<string, string>(a, データ1));
m->insert(pair<string, string>(a, データ2));
m->insert(pair<string, string>(a, データ3));
m->insert(pair<string, string>(b, データ4));
m->insert(pair<string, string>(b, データ5));
m->insert(pair<string, string>(b, データ6));
m->insert(pair<string, string>(c, データ7));
m->insert(pair<string, string>(c, データ8));
m->insert(pair<string, string>(c, データ9));
// 全key を keys に格納し
multimap<string,string>::iterator it = m->begin();
while ( it != m->end() ) {
keys.push_back(it->first);
++it;
}
// 重複を取り除く
keys.erase(unique(keys.begin(), keys.end()), keys.end());
// プリントしてみる
for ( vector<string>::size_type i = 0; i < keys.size(); ++i ) {
cout << keys[i] << endl;
}
delete m;
return 0;
}
レスありがとうございます。
島さんに教えて頂いた処理は、私も想像はしていました。つまり、ロジックで重複判定を
行なって、自前で作成する方法ですね。
επιστημη さんのやり方も興味深いです。
keys.erase(unique(keys.begin(), keys.end()), keys.end());
というやり方は知りませんでした。勉強になりました。
とおりすがりさんのやり方が一番シンプルで一般的ですね。
この方法でやってみようと思います。すみません。vectorにこだわっている訳ではなかっ
たのです。setならそれ自体が重複を許さないものなんですね。知りませんでした。
ループといっているのは、
for(Keysのループ)
{
for(Valuesのループ)
{
}
}
というようなことをやりたかったのです。
ありがとうございました。
大変、勉強になりました。
解決後にごにょごにょ言うのも気が引けるけど、
map< string,vector<string> > m;
でもよかったんじゃないかしら。
>解決後にごにょごにょ言うのも気が引けるけど、
>
> map< string,vector<string> > m;
>
>でもよかったんじゃないかしら。
自分で一から作成するソースなら仰るとおりでもいいと思うのですが、
multimap<string, string>というのは、顧客から提示された既存のソースで既に存在する
ものなので、変えることができないのです。
ところで、前からお聞きしたかったのですが、全然関係ない話ですが、「επιστημη」さ
んは、なんて読むのですか? 最初、日本人じゃないのかと思いました。
えぴすてーめー です。よろしゅう。