【问题标题】:combining map and array of string c++结合字符串c ++的映射和数组
【发布时间】:2012-10-06 04:58:17
【问题描述】:

我正在编写一个代码来检查一个人是否曾经访问过某个特定的地方 如果为 true,则不执行其他操作,将新地点添加到已访问地点列表中 我正在使用地图将学生姓名存储为键并将存储位置排列如下

#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 或其他数据构造器来执行此操作?

【问题讨论】:

    标签: c++ arrays map


    【解决方案1】:

    map&lt;string, vector&lt;string&gt; &gt; 这样的数据结构可以工作。

    您可以使用for (size_t i = 0; i &lt; it-&gt;second.size(); i++) 来遍历向量。

    【讨论】:

    • 使用迭代器也可以:std::vector<:string>::const_iterator vectorIt = it->second.begin();
    • 感谢这个工作,现在的问题是比较功能,我写它好像 ((*tt).compare(place)==0) 但对此没有任何建议插入函数
    • 试试if ((it-&gt;second)[i].compare(place)==0)
    • 插入函数使用iter-&gt;second.push_back(place)
    • 我通常使用指针vector&lt;string&gt;* p = &amp;it-&gt;socond。使用(*p)[i] 访问,p-&gt;push_back(element) 插入。
    【解决方案2】:

    看起来你想要一张字符串地图 -> 地点

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

    根据您的 sn-p 调整它(有许多问题,从令人困惑的格式开始......):

    #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

    【讨论】:

      【解决方案3】:

      我不会使用数组,因为我不知道它的大小,我更喜欢使用向量或列表,而不是使用布尔变量,我会插入然后中断循环,所以我的算法就像:

          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”变量。

      【讨论】:

        【解决方案4】:

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

        请改用std::map&lt; std::string, std::vector&lt;std::string&gt; &gt;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-15
          • 2012-01-23
          • 2013-09-18
          • 2013-06-15
          • 2020-12-12
          • 1970-01-01
          • 1970-01-01
          • 2017-07-28
          相关资源
          最近更新 更多