C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: multimapの検索について


(過去ログ 55 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■30814 / inTopicNo.1)  multimapの検索について
  
□投稿者/ YU (3回)-(2009/01/07(Wed) 10:27:22)

分類:[C/C++] 

宜しくお願いします。

multimapの使い方についてなのですが、ネットで色々調べても中々情報が少なく困っています。

例えば、
multimap<string, string> SEITO
があるとして、中身は下記の様だとします。
----------------------------------
Agumi tanaka
Agumi suzuki
Agumi kubota
Bgumi kaneda
Bgumi morita
Cgumi simizu
Cgumi kumagai
Cgumi yoshimura
----------------------------------
firstはチーム名でsecondは名前です。
これを使って「simizuのチーム名」を探す方法をどなたかご教授ください。
私事で恐縮なのですが事情により急を要する為、できれば記述例などを教えて頂ければと思います。
引用返信 編集キー/
■30816 / inTopicNo.2)  Re[1]: multimapの検索について
□投稿者/ YU (4回)-(2009/01/07(Wed) 10:45:00)
すいません、投稿時にスペースが詰められて見づらいようなのでもう一度あげます。
-----------------------------------
first | second
-----------------------------------
Agumi | tanaka
Agumi | suzuki
Agumi | kubota
Bgumi | kaneda
Bgumi | morita
Cgumi | simizu
Cgumi | kumagai
Cgumi | yoshimura
----------------------------------

宜しくお願いします。
引用返信 編集キー/
■30817 / inTopicNo.3)  Re[1]: multimapの検索について
□投稿者/ επιστημη (1485回)-(2009/01/07(Wed) 10:53:27)
επιστημη さんの Web サイト
2009/01/07(Wed) 11:12:40 編集(投稿者)

> multimap<string, string> SEITO
>...
> ----------------------------------
> firstはチーム名でsecondは名前です。
> これを使って「simizuのチーム名」を探す方法をどなたかご教授ください。

keyからvalueを引き当てるんじゃなく、逆引き(valueからkeyを引き当て)ですね?
map/multimapは逆引きできません。iteratorくるくる回して全要素を舐めるっきゃないでしょう。

# ところで 清水君がたーくさんいたときどうすんです?
# 最初の一人? 全員列挙? ほかのなにか?

> 事情により急を要する為

これは禁句。「知ったことか」と返されるのがオチ。

引用返信 編集キー/
■30834 / inTopicNo.4)  Re[2]: multimapの検索について
□投稿者/ ふくちゃん (17回)-(2009/01/07(Wed) 18:02:21)
自分の場合ですが、このようなケースでしたら、
SEITO情報を構造体で持っておき、
std::vector配列で持っておいて アルゴリズムのstd::find_ifを使いますかね?


find_ifは条件を複数指定できるので、うまく使えば検索可能ですし、
地道にfor文をまわして検索するよりかは早いと思います。


以下find_ifの情報サイトです。
http://www.wakhok.ac.jp/~sumi/stl/header/algorithm.html

επιστημη さんの意見と重複しますが、
SEITO構造体には 重複しない Indexの項目を付けておくと、もっとよいでしょう。
引用返信 編集キー/
■30835 / inTopicNo.5)  Re[2]: multimapの検索について
□投稿者/ yu-yu (1回)-(2009/01/07(Wed) 18:23:07)
2009/01/08(Thu) 01:32:49 編集(投稿者)
>これを使って「simizuのチーム名」を探す方法をどなたかご教授ください。

やりたいことはこんな感じでしょうか?

#include <iostream>
#include <algorithm>
#include <map>
#include <string>
typedef std::pair<std::string, std::string> Status;
typedef std::multimap<std::string, std::string> School;

class search_name
{
public:
    const std::string& student_name_;
    search_name(const std::string& name)
        : student_name_(name) {}
    bool operator()(const Status& s) const
    {
        return s.second == student_name_;
    }
};

int main(int argc, char** argv)
{
    School s;
    s.insert(std::make_pair("Agumi", "tanaka"));
    s.insert(std::make_pair("Agumi", "suzuki"));
    s.insert(std::make_pair("Agumi", "kubota"));
    s.insert(std::make_pair("Bgumi", "kaneda"));
    s.insert(std::make_pair("Cgumi", "morita"));
    s.insert(std::make_pair("Cgumi", "simizu"));
    s.insert(std::make_pair("Cgumi", "kumagai"));
    s.insert(std::make_pair("Cgumi", "yoshimura"));

    std::string simizukun("simizu");

    School::iterator it = s.begin();
    School::iterator end = s.end();
    while ( (it = std::find_if(it, end, search_name(simizukun))) != end )
    {
        std::cout << simizukun << "は" << it->first << "に所属しています。" << std::endl;
        ++it;
    }
    return 0;
}

> # ところで 清水君がたーくさんいたときどうすんです?
> # 最初の一人? 全員列挙? ほかのなにか?
ですね。清水君がAgumiに二人居たりさらにBgumiにも居たりすると、どうするんでしょう?
一応サンプルで書いたコードでは全清水君が表示されます。

# でもこれならmultimapである必要はないのでvectorで十分ですね
# Agumiの中から清水君を全員見つけたいとかならmultimapの方がよさそうです。
# この場合は
    School::iterator it = s.begin();
    School::iterator end = s.end();
を
    School::iterator it = s.lower_bound("Agumi");
    School::iterator end = s.upper_bound("Agumi");
に書き換えれば出来ます。

引用返信 編集キー/
■30836 / inTopicNo.6)  Re[2]: multimapの検索について
□投稿者/ yu-yu (2回)-(2009/01/07(Wed) 18:26:49)
2009/01/07(Wed) 18:28:38 編集(投稿者)
二重投稿になったので削除

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -