gpt4 book ai didi

c++ - 具有非随机访问迭代器的非单元迭代器步幅

转载 作者:太空狗 更新时间:2023-10-29 20:29:37 25 4
gpt4 key购买 nike

使用随机访问迭代器,您可以通过简单地执行 iter+=n 然后使用 < container.end() 而不是 != container.end() 作为循环结束条件来更改步长:

#include <iostream>
#include <vector>

int main(int argc, char *argv[])
{
typedef std::vector<float> VectorType;
typedef VectorType::const_iterator IteratorType;

VectorType v;
for(unsigned int i = 0; i < 11; ++i)
{
v.push_back(i);
}

for(IteratorType iter = v.begin(); iter < v.end(); iter += 2)
{
std::cout << " " << *iter;
}

return 0;
}

但是 += 2 和 < iter.end() 对于 std::set 之类的东西似乎都是未定义的。想要遍历一个集合只访问所有其他元素(对其进行子采样)似乎是合理的,不是吗?还有其他方法吗?

最佳答案

With a random access iterator, you can change the stride length by simply doing iter+=n and then using < container.end() instead of != container.end() as the loop ending condition

事实上,你不能。虽然代码可以编译,但如果迭代器实际上前进到容器末尾之外,它会在运行时表现出未定义的行为。您不能将迭代器递增到超出它指向的范围的末尾。

无论如何,你可以写一个函数模板来帮助:

template <typename TForwardIt, typename TDifference>
bool try_advance(TForwardIt& it,
TForwardIt const end,
TDifference n)
{
TDifference i(0);
while (i < n && it != end)
{
++i;
++it;
}

return i == n;
}

关于c++ - 具有非随机访问迭代器的非单元迭代器步幅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9387569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com