我有一个函数,我存储所有目录及其相应的文件。
我在显示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
}
}
错误:在循环中使用循环
答案 0 :(得分:1)
<< d->second
不起作用,因为这是一个集合。
您已经知道使用for( ; ; )
循环显示集合的一种方法。由于容器内有容器,因此在for循环中需要一个for循环来打印所有元素。
作为奖励,您可以在这里编写更紧凑的循环:
for (auto&& element : container) { ...
不需要迭代器,开始和结束调用。这一切都是为你处理的。循环体对容器中的每个元素执行一次。同样的限制适用:不要在循环内部尝试添加或删除元素。
[编辑]
你添加了一种新的第三种for循环。出于某种原因,您现在尝试使用for(int i = 0; i != container.size; ++i)
迭代容器。为什么?你已经知道一种有效的方法,我只是向你展示了另一种有效的方式。
[i]
需要operator[]
,这在大多数容器中都不存在。 begin/end
存在于所有容器中。