Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何在C++;集装箱的顺序相反? 假设我是新手C++程序员。我有一个C++容器;比如说,向量: std::vector<int> vec { 12, 34, 56, 78 };_C++_Iteration_Containers_Reverse_Idioms - Fatal编程技术网

我应该如何在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&
    ,因为新手程序员通常不知道它们

首先,关于你的两个代码片段:部分问题是,对于实际的新手来说,它们有点容易出现错误-整数下溢,在比较中以1为单位,忘记了
i
的含义,并将其用作普通索引等。因此,我肯定会推荐其他东西。此外,这些代码段可能多次调用
vec.size()
,如果编译器没有充分优化,这将意味着大量冗余工作

选项1:使用迭代器 可以使用一对迭代器(、及其常量变量)反向迭代容器,这表示容器元素顺序的反转。下面是它的样子:

for(auto it = std::crbegin(vec); it != std::crend(vec); it++) {
    std::cout << *it << '\n';
}

他们要么使用一个“基础结构”库(即Boost),要么编写几行代码,返回一个迭代器对在中,这对于C++在A.P/P>中是足够用的。 选项3:使用Range for和C++20的范围支持 最后,在C++20中,这一切都变得更容易了—有了范围支持和:

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';
}