我在哪个对象的迭代

Kit*_*tet 1 c++ stdvector pugixml

我目前正在使用pugi xml,我经常使用这样的循环:

for (pugi::xml_node sth: root.child("name").children())
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

然后在某些时候我意识到我需要在WHICH迭代中保存信息,我找到了一些值,因为稍后需要在此循环之外.我可以在不添加计数器的情况下判断我正在进行哪次迭代吗?

此外,如果该对象是这样的矢量:

std::vector<type> vtr;
for (std::vector<type>::iterator it = vtr.begin(); it != vtr.end(); ++it)
{
    //which iteration?
}
Run Code Online (Sandbox Code Playgroud)

Cor*_*mer 5

在任何感兴趣的迭代器中,您都可以这样做

auto index = it - vtr.begin();
Run Code Online (Sandbox Code Playgroud)

那么vtr.begin()将是索引0,然后每个元素从那里递增.
或者你可以使用std::distance.

auto index = std::distance(vtr.begin(), it)
Run Code Online (Sandbox Code Playgroud)

  • @PengZhang如果没有可用的随机访问(例如`std :: list`),它只需要线性时间.对于`std :: vector`减法时间是常数,`O(1)`. (2认同)
  • @PengZhang"if*it*是一个随机访问迭代器,函数使用`operator -`来计算它.否则,函数会反复使用增量运算符(`operator ++`)." (2认同)