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

我认为问题出在字符串迭代器的数组上,你能帮我找到正确的方法吗?我是否需要使用 multimap 或其他数据构造器来执行此操作?

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,我不会使用“auto”变量。

于 2012-10-16T06:56:16.673 回答
0

C++ 中的数组是从 C 继承的类型或构造之一,因此内置数组“类型”没有任何迭代器。它也不会跟踪其当前大小,因此您无法在不存储数组大小的情况下获取数组的开始和结束迭代器。

改为使用std::map< std::string, std::vector<std::string> >

于 2012-10-16T06:48:14.800 回答