【发布时间】:2020-06-13 15:21:24
【问题描述】:
假设我是一个新手 C++ 程序员。我有一个 C++ 容器;比如说一个向量:
std::vector<int> vec { 12, 34, 56, 78 };
我知道我可以通过一个简单的循环遍历所有元素:
for(std::vector<int>::size_type i = 0; i < vec.size(); i++) {
std::cout << vec[i] << '\n';
}
也许我什至对现代 C++ 有所了解,所以我知道我可以使用 ranged-for 循环:
for(auto x : vec) {
std::cout << x << '\n';
}
但是现在,我想以相反的顺序迭代元素。基于范围的 for 循环不会这样工作。使用普通循环,我必须小心并避免下溢,所以也许是这样的? :
for(std::vector<int>::size_type i = 0; i < vec.size(); i++) {
std::cout << vec[vec.size() - i] << '\n';
}
但是 - 我不喜欢循环计数器的含义与我们所看到的相反。但是如果我从vec.size()-1 开始i,我会冒着在最后一个元素之后出现下溢的风险。所以我需要这样做,也许?
for(std::vector<int>::size_type i = vec.size(); i > 0 ; i--) {
std::cout << vec[i - 1] << '\n';
}
嗯,感觉也不对。我应该使用哪些成语进行反向迭代,哪些是安全的(即不易出错)、美观且合理简洁?
注意事项:
- 我试图使标题尽可能简单(而不是说“反向迭代容器”)。
- 受this question 的启发,其中一个幼稚的反向迭代循环存在错误。
- 我确实不想用元素制作容器的副本,然后以通常的方式反转和迭代。
- 我没有在上面的循环中使用
auto&或const auto&,因为新手编码人员通常不知道它们。
【问题讨论】:
-
@Nick:问题及其答案属于至少一种(如果不是 3 种)语言的早期时代。我觉得你的建议没有道理。但实际上: 4. 再看一遍,这实际上根本不是关于 C++ 的问题!这个问题完全是关于 C# 的。有一个关于 C++ 的答案,但它并没有真正回答这个问题。
-
@Nick:是的,这是真的。如果您将此问题标记为对那个问题的欺骗,我将不得不接受。
-
@Nick:哎呀。我讨厌结束自己的问题。完成。
标签: c++ iteration containers reverse idioms