迭代器二维列表

时间:2017-04-19 10:19:14

标签: c++ arrays list iterator std-pair

我正在尝试使用迭代器滚动二维列表,我知道我错过了一些东西,但我不知道是什么。

所以我的想法是我要解析一些命令。

schema of my list

我把它们放在一个列表上然后我想检查列表中的成员是否等于" data.txt"例如。所以我为此做了一个迭代器,但由于它是一个二维列表,里面有一个std :: pair,我不知道如何实现这个迭代器。我做到了这一点,但它并不好,我无法读取这两个列表。

typedef std::list<std::string>  listStr;

std::list <std::pair<listStr, int> >  _execCmd;


int     Parser::execCmd()
{
   std::list<std::string>::const_iterator i;

   for (i = _execCmd.front().first.begin(); i != _execCmd.back().first.end(); ++i)                                          
    {                                                         
      if (*i == "Search.txt")                                       
        execSearch();                                          
      else if (*i == "data.txt")                                  
        execData();
    }
  return (0);
}

在这种情况下,我留在第一个列表&#34; File.txt data.txt contact.txt&#34; (参见:schema)我可以浏览第二个列表&#34; Search.txt employe.csv&#34;。

我也试过这个:

int     Parser::execCmd()
{
  std::list<std::pair<listStr, int> >::const_iterator i;

  for (i = _execCmd.begin(); i != _execCmd.end(); ++i)        
   {
     if (*i == "Search.txt")                                    
        execSearch();                                  
     else if (*i == "data.txt")                               
        execData();                           
   }
  return (0);
}

但我无法编译,因为我不知道如何将迭代器与字符串(*i == "help")进行比较

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

std::pair<X,Y>包含两个成员,first获取类型为X的成员和second成员{。}}。

在您的情况下,感谢Y您有typedef

因此,要迭代该结构中的所有std::list<std::pair<std::list<std::string>, int> >,您需要遍历外部列表以获取对,从每个std::string成员{类型first获取std::list<string>成员},并迭代该内部列表的永远元素。

int Parser::execCmd()
{
    std::list<std::pair<listStr, int> >::const_iterator i;

    for (i = _execCmd.begin(); i != _execCmd.end(); ++i)        
    {
        // i->first is of type std::list<std:string>

        for (j = i->first.begin(); j != i->first.end(); ++j)
        {
             if (*j == "Search.txt")                                    
                 execSearch();                                  
             else if (*j == "data.txt")                               
                 execData();                           
        }
   }
   return (0);
}

在C ++ 11中,它更简单,但仍然需要嵌套循环。

int Parser::execCmd()
{
    std::list<std::pair<listStr, int> >::const_iterator i;

    for (const auto &i : _execCmd))        
    {
        // i.first is of type std::list<std:string>

        for (const auto &j : i.first)
        {
             if (j == "Search.txt")                                    
                 execSearch();                                  
             else if (j == "data.txt")                               
                 execData();                           
        }
   }
   return (0);
}

答案 1 :(得分:0)

正如我在评论中所说,在c ++中迭代std::list的方式是使用foreach语法。

iterator 的想法是为您提供对容器中元素的指针式访问,以便为容器提供对这些元素进行操作的方法。例如,给定迭代器,您可以删除列表中的元素。或者您可以在特定位置插入元素。

需要的只是遍历列表元素并检查是否有&#34; search.txt&#34;或&#34; data.txt&#34;。所以你不需要任何迭代器,你只需要元素。这就是c ++中基于范围的for循环。 (看看这个好问题:What is the correct way of using C++11's range-based for?

注意内部基于范围的for循环内部may use iterators

  std::list<std::pair<listStr, int> >::const_iterator i;

  for (std::pair<listStr, int> &elementFromOuterList: _execCmd) {
      // now given that elementFromOuterList you can do whatever you need to
  }