如何在MAP stl:C ++中显示LIST中包含的值

时间:2015-02-03 09:26:03

标签: c++ file stl

Image

我有一个函数,我存储所有目录及其相应的文件。

我在显示VALUE地图时遇到问题。我已经调试并观察到相应的值被正确存储但我无法显示它。由于map的value部分本身就是一个pathiterator列表。每当我在不同的目录中获得相同的文件名时,我将在相应的键(文件名)对应的地图中存储引用或路径。请仔细研究一下。

void search()
      {
          using path_1 = std::string;     
          using paths_1 = std::set<path_1>;
          using pathiter = paths_1::iterator;
          using listofiter = std::list<pathiter>;
          using file = std::string;
          using store = std::map<file, listofiter>;
          using store_iter = store::iterator;
          paths_1 pp;
          pathiter oo;
          store s6;
          for (recursive_directory_iterator i("."), end; i != end; ++i)
          {
              pp.insert(i->path().parent_path());
              oo = pp.find(i->path().parent_path());

              if (!is_directory(i->path()))
              {
                  s6[i->path().filename()].push_back(oo);
              }
          }
          store_iter d;
          for ( d = s6.begin(); d != s6.end(); d++)
          {
              cout << "Key: " << d->first << "  Value: "<<d->second;
                                                         // ^^not able 
//to print it!! 

          }
   }

我添加了调试时的截图。如果同一文件存在于不同位置,则d->second {size}将超过1。

我想过应用循环:这就是我所做的。我想我搞砸了。

  for ( d = s6.begin(); d != s6.end(); d++)
          {
              cout << "Key: " << d->first << "  Value: ";
              for (int i = 0; i < d->second.size; i++)
              {
                  cout << d->second[i];
                                 //  ^^Error at this place
              } 
          }

错误:在循环中使用循环

enter image description here

1 个答案:

答案 0 :(得分:1)

<< d->second不起作用,因为这是一个集合。

您已经知道使用for( ; ; )循环显示集合的一种方法。由于容器内有容器,因此在for循环中需要一个for循环来打印所有元素。

作为奖励,您可以在这里编写更紧凑的循环:

for (auto&& element : container) { ...

不需要迭代器,开始和结束调用。这一切都是为你处理的。循环体对容器中的每个元素执行一次。同样的限制适用:不要在循环内部尝试添加或删除元素。

[编辑] 你添加了一种新的第三种for循环。出于某种原因,您现在尝试使用for(int i = 0; i != container.size; ++i)迭代容器。为什么?你已经知道一种有效的方法,我只是向你展示了另一种有效的方式。

顺便说一下,它不起作用的原因是[i]需要operator[],这在大多数容器中都不存在。 begin/end存在于所有容器中。