multimapのキーを収集する方法 – プログラミング – Home

multimapのキーを収集する方法
 
通知
すべてクリア

[解決済] multimapのキーを収集する方法


shimodate
 shimodate
(@shimodate)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

いつも大変、お世話になっております。
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という風に格納したいのですが何
かよい方法はあるものでしょうか?

よろしくお願い致します。


引用未解決
トピックタグ
shimodate
 shimodate
(@shimodate)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

すみません。もう少し補足させて頂きます。
multimapにおけるKeyのループとValueのループを構成したいのです。
valueのループはequal_eange()で出来ることは分かったのですが、Keyをどうやってルー
プさせればよいか考えているところです。

よろしくお願い致します。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>というソースで、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 に登録した場合、後ろから順に見ていって、値が変るまで削除していけば
重複はなくなるはずですね


返信引用
とおりすがり
 とおりすがり
(@とおりすがり)
ゲスト
結合: 23年前
投稿: 180
 

keysを、vector<string> ではなく、
set<string> にすれば、
単に、multimapのiteratorをまわしてinsertしていくだけでいいと思います。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

#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;
}


返信引用
shimodate
 shimodate
(@shimodate)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

レスありがとうございます。

島さんに教えて頂いた処理は、私も想像はしていました。つまり、ロジックで重複判定を
行なって、自前で作成する方法ですね。

επιστημη さんのやり方も興味深いです。

keys.erase(unique(keys.begin(), keys.end()), keys.end());

というやり方は知りませんでした。勉強になりました。

とおりすがりさんのやり方が一番シンプルで一般的ですね。
この方法でやってみようと思います。すみません。vectorにこだわっている訳ではなかっ
たのです。setならそれ自体が重複を許さないものなんですね。知りませんでした。

ループといっているのは、

for(Keysのループ)
{
for(Valuesのループ)
{
}
}

というようなことをやりたかったのです。

ありがとうございました。
大変、勉強になりました。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

解決後にごにょごにょ言うのも気が引けるけど、

map< string,vector<string> > m;

でもよかったんじゃないかしら。


返信引用
shimodate
 shimodate
(@shimodate)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

>解決後にごにょごにょ言うのも気が引けるけど、
>
> map< string,vector<string> > m;
>
>でもよかったんじゃないかしら。

自分で一から作成するソースなら仰るとおりでもいいと思うのですが、
multimap<string, string>というのは、顧客から提示された既存のソースで既に存在する
ものなので、変えることができないのです。

ところで、前からお聞きしたかったのですが、全然関係ない話ですが、「επιστημη」さ
んは、なんて読むのですか? 最初、日本人じゃないのかと思いました。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

えぴすてーめー です。よろしゅう。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました