c++ - 不使用 vector.end() 迭代 std::vector

标签 c++ iterator

这里是 C++ 菜鸟。我写了一个从 vector 返回迭代器的函数,我想用这个迭代器从头到尾遍历 vector 。然而, vector 迭代器是这样使用的

for (auto iterator = vec.begin(); iterator != vec.end(); iterator ++) {
// do something here
}

这意味着我还需要一个 vec.end() 才能工作。无论如何我只能使用 vec.begin() 来遍历 vector ,就像我在 python 中通常做的那样

for value in some_iterator:
# do something

编辑:一些不相关的更新:

我看到一些关于我的 python 迭代器和 iterable 的评论。迭代器确实可以这样使用(至少在 Python 3 中)。例如:

some_list = [1,2,3,4]
some_iterator = iter(some_list)
for value in some_iterator:
    print(value)

最佳答案

C++ 不是 Python。需要 std::vector::iterator 来表示范围(起点和终点一个)。如果您只有一个 Iterator,那么没有什么可以安全地使用它(除了将它与自身进行比较,这是空洞的 true)。

你混淆了 Python iterable 的 python 概念,这是一个值序列。这与 Python iterator 不同,它是一个带有 next()(Python 3 中的 __next__())的对象,返回下一个值或抛出 StopIteration

for value in some_iterable:
    #do something here

大致对应

_iter = some_iterable.__iter__()
while True:
    try
        value = _iter.__next__()
    except StopIteration:
        break;
    #do something here

你可能想要一个范围语句

for (auto val : vec){
    // do something here
}

大致对应

{
    auto && __range = vec; 
    for (auto __begin = begin(__range), __end = end(__range);  __begin != __end; ++__begin) { 
        auto val = *__begin; 
        // do something here
    } 
} 

(在这两个版本中,以_开头的局部变量实际上并不存在,名称是说明性的)

C++ 迭代器将值的返回(*itit->)从移动(++it 等)中分离出来;从停止 (it != end) 开始,end 指向最后一个元素过去。 Python 迭代器在 next() 中完成这一切。

关于c++ - 不使用 vector.end() 迭代 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51597626/

相关文章:

python - 重构此 Python 代码以迭代容器

c++ - 迭代器的值

java - std::vector 和 java.util.Vector 之间的差异

c++ - 内部类和外部成员的访问

c++ - 在 C++ 中使用显式原型(prototype)进行返回类型推导

c++ - 将 char 添加到字符串会导致 C++ 崩溃

c++ - 获取返回的 multimap 迭代器的内容

c++ - 多态性和检查一个对象是否有某个成员方法

c++ - 当迭代器在双端队列中失效时,引用如何有效

java - 为什么这段代码会抛出ConcurrentModificationException?