首页 > 解决方案 > Iterate std::vector without using vector.end()

问题描述

C++ rookie here. I wrote a function that returns an iterator from a vector, and I want to use this iterator to iterate through the vector from beginning to end. However, the vector iterator is used like this

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

which means I also need a vec.end() for this to work. Is there anyway I can only use vec.begin() to iterate through a vector, as I commonly did in python

for value in some_iterator:
# do something

edit: some irrelevant update:

I see some comments about my python iterator vs iterable. The iterator can indeed be used this way (at least in Python 3). For example:

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

标签: c++iterator

解决方案


C++ 不是 Python。需要一std::vector::iterators 来表示一个范围(开始和结束后的一个。如果您只有一个Iterator,则您无法安全地使用它(除了将其与自身进行比较,即 vacuously true)。

您混淆了Python iterable的 Python 概念,它是一个值序列。这与 Python迭代器不同,后者是一个带有next()(__next__()在 Python 3 中) 返回下一个值或抛出的对象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().


推荐阅读