StopIteration
是 Python 中的一个特殊异常,当您尝试获取新元素但不再存在时,迭代器会抛出该异常。这就是 Python 检测何时停止循环(如for x in iterator
. 这基本上在 Python 中转换为:
while True:
try: value = next(iterator)
except StopIteration: break
# do something...
但是,C++ 的 STL 中的迭代器有很大不同。我不确定您希望在哪个级别看到 C++ 翻译。如果你有类似 Python 中的迭代器,你也许可以 1:1 转换代码。但是 STL 迭代器的行为不是这样的。如果您尝试在没有下一个元素时读取它,它不会抛出异常。该行为是相当不确定的,很可能会导致崩溃。在所有容器的 STL 中,总是有一个特殊的结束迭代器(它在容器之外!)并且你检查你的迭代器是否等于结束迭代器。如果是这种情况,您知道您不能阅读任何其他元素。这大多看起来像这样:
auto iterator = mylist.begin(); // get the iterator at the start of mylist
while(iterator != mylist.end()) { // check if our iterator is not equal to the end-iterator
auto value = *iterator; // get the value of the iterator
// do something with value
++iterator; // advances the iterator by one
}
请注意,next()
在 Python 中做了两件事:如果有一个值,则返回当前值并将迭代器前进 1。否则,它会引发StopIteration
异常。在 C++ 中,当前值通过返回*iterator
,迭代器前进++iterator
. 此外,在 C++ 中,也不例外,因此您必须自己进行检查(即iterator != mylist.end()
)。
用 C++ 编写它的一种更短且更常见的方法是:
for(auto iterator = mylist.begin(); iterator != mylist.end(); ++iterator) {
auto value = *iterator; // get the value of the iterator
// do something with value
}
或者,更短:
for(auto value : mylist) {
// do something with value
}
list
对于所有 STL 容器,如, vector
, deque
, set
,的代码都是这样工作的multiset
。Avector
主要是内部的一个数组。但是 C 数组(例如int numbers[N];
)不适用于前两个代码示例,因为它不是对象并且没有begin()
andend()
函数。但是,最后一个示例也适用于这种情况。
如果你编写一个自己的容器类,你还应该实现一些使上述代码像这样工作的函数begin()
。end()
请注意,C++ 中的文件读取再次不同。在 Python 中,当您使用 时for x in myfile
,它会自动在文件的行上生成一个迭代器,并且您正在使用该迭代器。当然,Python 中还有其他方法可以读取文件,例如myfile.read()
. 后者在 C 中有一个直接的等价物,即fread()
(或者也简单地read()
,但你应该使用fread()
它,因为它更节省并且你得到缓存)。但是 C/C++ 中有很多不同的方式来读取文件,我不会在这里列出所有的可能性。
sys.exit()
主要相当于 C-function exit()
。但是您最好只return
从所有功能开始,并在最后return
退出,main()
以便您的应用程序退出。