迭代器二维列表
Iterator two dimensional 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);
}
在那种情况下,我留在第一个列表 "File.txt data.txt contact.txt"(cf: schema),我可以浏览第二个列表 "Search.txt employe.csv".
我也试过这个:
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"
)
有人可以帮我吗?
一个std::pair<X,Y>
包含两个成员,first
获取X
类型的成员,second
获取Y
类型的成员。
在你的情况下,多亏了 typedef
你有一个 std::list<std::pair<std::list<std::string>, int> >
.
因此,要遍历该结构中的所有 std::string
,您需要遍历外部列表以获取对,从每个([= 类型的)中获取 first
成员21=],并遍历该内部列表的所有元素。
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);
}
正如我在评论中所说,在 C++ 中迭代 std::list
的方法 是使用 foreach 语法。
迭代器的想法是让您可以像指针一样访问容器中的元素和,从而为对这些元素进行操作的容器。例如,给定一个迭代器,您可以删除列表中的一个元素。或者您可以在特定位置插入一个元素。
而你需要的只是遍历列表元素,检查是否有"search.txt"或"data.txt"。所以你不需要任何迭代器,你只需要元素。这就是 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
}
我正在尝试使用迭代器滚动二维列表,我知道我遗漏了一些东西,但我不知道是什么。
所以我的想法是我要解析一些命令。
我把它们放在一个列表中,然后我想检查列表中的一个成员是否等于 "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);
}
在那种情况下,我留在第一个列表 "File.txt data.txt contact.txt"(cf: schema),我可以浏览第二个列表 "Search.txt employe.csv".
我也试过这个:
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"
)
有人可以帮我吗?
一个std::pair<X,Y>
包含两个成员,first
获取X
类型的成员,second
获取Y
类型的成员。
在你的情况下,多亏了 typedef
你有一个 std::list<std::pair<std::list<std::string>, int> >
.
因此,要遍历该结构中的所有 std::string
,您需要遍历外部列表以获取对,从每个([= 类型的)中获取 first
成员21=],并遍历该内部列表的所有元素。
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);
}
正如我在评论中所说,在 C++ 中迭代 std::list
的方法 是使用 foreach 语法。
迭代器的想法是让您可以像指针一样访问容器中的元素和,从而为对这些元素进行操作的容器。例如,给定一个迭代器,您可以删除列表中的一个元素。或者您可以在特定位置插入一个元素。
而你需要的只是遍历列表元素,检查是否有"search.txt"或"data.txt"。所以你不需要任何迭代器,你只需要元素。这就是 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
}