c++ - 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++ 不是 Python。需要一对std::vector::iterator
s 来表示一个范围(开始和结束后的一个)。如果您只有一个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++ 迭代器将返回的值 (*it
和it->
) 从移动 (++it
等 ) 中分离出来;并从停止 ( it != end
) 开始,其中end
指向最后一个元素。Python 迭代器在next()
.
推荐阅读
- javascript - GetDisplayMedia - 调整共享应用程序窗口大小时是否有要监听的事件
- node.js - VsCode 终端 - 如何清除终端回滚缓冲区 - Windows 10
- c - 为什么 c 程序代码不询问第二个值以及为什么 char 以 int 形式存储我从网络上的示例中获取
- c# - 如何以最有效的方式呈现巨大的 JSON 文件 (1.8) Gb
- javascript - 如何访问vue事件全局总线传递的对象属性
- google-apps-script - 如果单独调用或从循环调用,Classroom API 在函数中的不同行为
- python - 将字符串拆分为列表,但引号中的两个单词为一个?
- django - Saleor 电子商务软件构建给出错误'npm ERR!缺少脚本:构建资产'
- amazon-web-services - 我怎么知道签名网址的签名?
- python - 如何对变量进行字符串格式化?