我应该如何在C++;集装箱的顺序相反? 假设我是新手C++程序员。我有一个C++容器;比如说,向量: std::vector<int> vec { 12, 34, 56, 78 };
嗯,那感觉也不对。对于反向迭代,我应该使用哪些安全(即很难出错)、美观且合理简洁的习惯用法 注:我应该如何在C++;集装箱的顺序相反? 假设我是新手C++程序员。我有一个C++容器;比如说,向量: std::vector<int> vec { 12, 34, 56, 78 };,c++,iteration,containers,reverse,idioms,C++,Iteration,Containers,Reverse,Idioms,嗯,那感觉也不对。对于反向迭代,我应该使用哪些安全(即很难出错)、美观且合理简洁的习惯用法 注: 我试图将标题表述得尽可能简单(而不是说“反向迭代容器”) 受此启发,一个幼稚的反向迭代循环有一个bug 我不想复制包含元素的容器,并以通常的方式反转和迭代 我没有在上面的循环中使用auto&或const auto&,因为新手程序员通常不知道它们 首先,关于你的两个代码片段:部分问题是,对于实际的新手来说,它们有点容易出现错误-整数下溢,在比较中以1为单位,忘记了i的含义,并将其用作普通索引等。因此
- 我试图将标题表述得尽可能简单(而不是说“反向迭代容器”)
- 受此启发,一个幼稚的反向迭代循环有一个bug
- 我不想复制包含元素的容器,并以通常的方式反转和迭代
- 我没有在上面的循环中使用
或auto&
,因为新手程序员通常不知道它们const auto&
i
的含义,并将其用作普通索引等。因此,我肯定会推荐其他东西。此外,这些代码段可能多次调用vec.size()
,如果编译器没有充分优化,这将意味着大量冗余工作
选项1:使用迭代器
可以使用一对迭代器(、及其常量变量)反向迭代容器,这表示容器元素顺序的反转。下面是它的样子:
for(auto it = std::crbegin(vec); it != std::crend(vec); it++) {
std::cout << *it << '\n';
}
他们要么使用一个“基础结构”库(即Boost),要么编写几行代码,返回一个迭代器对在
auto reverse_view=std::ranges::reverse_view{vec};
用于(常量自动和x:反向视图){
std::想不出std::list-您必须浏览整个列表才能到达那里::复杂性:常量。我认为,一般来说,所有容器都支持快速访问end
@PaulSanders:See edit。std::forward\u list::iterator
是ForwardIterator,而不是双向iterator,您不能反转it@PaulSanders:还有-我的失态“当你从不使用<代码> STD::*列表**/COD>……@ EnPOKLUM,不用担心。这几乎不是一个大错误。”Nick:问题和答案属于至少一个(如果不是3个)的早期时代。我认为你的建议没有道理。但是实际上:4。第二,实际上,这不是一个关于C++的问题。关于C++的问题是直截了当的,关于C++有一个答案,但它并没有真正回答这个问题。Nick:是的,这是真的。如果你把这个问题标记为一个问题,我必须接受。
for(auto x : vec) {
std::cout << x << '\n';
}
for(std::vector<int>::size_type i = 0; i < vec.size(); i++) {
std::cout << vec[vec.size() - i] << '\n';
}
for(std::vector<int>::size_type i = vec.size(); i > 0 ; i--) {
std::cout << vec[i - 1] << '\n';
}
for(auto it = std::crbegin(vec); it != std::crend(vec); it++) {
std::cout << *it << '\n';
}
auto reverse_view = /* magic involving vec; and not making a copy */
for(auto x : reverse_view) {
std::cout << *it << '\n';
}
auto reverse_view = std::ranges::reverse_view{vec};
for (const auto& x : reverse_view) {
std::cout << x << '\n';
}