4

ある人が以前に特定の場所を訪れたことがあるかどうかを確認するコードを書いています。本当の場合は、他に何もしないでください。新しい場所を訪問した場所のリストに追加します。地図を使用して学生の名前をキーとして保存し、次のように場所を保存します

#include<map>
using namespace std;

map<string,string[]> stu_plac;
map<string,string[])::iterator it;

マップ全体を検索するための方法が見つかりませんでした

私は次のことを試しました:

bool exist=false;
if(stu_plac.count(name))
{
    it=stu_plac.find(name);
    for(auto tt=(*it).second.begin(); tt!=(*it).second.end(); tt++)
    {
        if (tt.compare(place)==0)//exist
        {
            exist=true;
        }
        break;
    }
    if (!exist)
    {
        (*it)second[++tt]=place;
    }
}
else
{
    stu_plac.insert(pair<string,string[]>(name,place));
}

問題は文字列イテレータの配列にあると思います。これを行う正しい方法を見つけるのを手伝っていただけませんか。これを行うには、マルチマップまたは他のデータ構造を使用する必要がありますか?

4

4 に答える 4

5

のようなデータ構造map<string, vector<string> >が機能します。

for (size_t i = 0; i < it->second.size(); i++)ベクトルをトラバースするために使用できます。

于 2012-10-16T06:42:31.087 に答える
4

文字列->場所の地図が必要だったようです

typedef map<string,std::set<string> > Map;

スニペットに適合させる(紛らわしいフォーマットから始めて、多くの問題がありました...):

#include<map>
#include<set>
#include<string>
using namespace std;

typedef map<string,std::set<string> > Map;
typedef Map::iterator It;

int main()
{
    bool exist=false;
    Map stu_plac;
    string name = "name";
    string place = "0.0.0.0";

    It it = stu_plac.find(name);
    if (stu_plac.end() != it)
    {
        std::set<string>& visits = it->second;
        exist = visits.end() != visits.find(place);

        if (!exist)
            visits.insert(place);
    }
}

しかし実際にはあなたは使用することを好むかもしれませんstd::multimap

于 2012-10-16T06:55:19.193 に答える
2

サイズがわからないため、配列を使用しません。ベクトルまたはリストを使用することを好みます。ブール変数を使用する代わりに、ループを挿入してから中断するため、アルゴリズムは次のようになります。

    std::map<std::string, std::list<std::string> > stu_plac;
    std::map<std::string, std::list<std::string> >::iterator it;
    std::string myName("Edu");
    std::string myPlace("Madrid");

....。

for( it = stu_plac.begin(); it != stu_plac.end(); it++){
            if(it->first == myName){
                    std::list<std::string>::iterator place = std::find(it->second.begin(), it->second.end(), myPlace);
                    if(place == it->second.end()){
                            it->second.push_back(myPlace);
                            break;
                    }
            }
    }

必要な都市を追加するために取得したイテレータを使用できることを確認してください。

ちなみに、C ++ 11でなければ、「自動」変数は使用しません。

于 2012-10-16T06:56:16.673 に答える
0

C ++の配列は、Cから継承された型または構造の1つであるため、組み込み配列「type」にはイテレータがありません。また、現在のサイズを追跡しないため、サイズを保存せずに配列の開始イテレータと終了イテレータを取得することはできません。

std::map< std::string, std::vector<std::string> >代わりに使用してください。

于 2012-10-16T06:48:14.800 に答える