【问题标题】:How do I reverse a C++ vector?如何反转 C++ 向量?
【发布时间】:2012-02-11 05:49:53
【问题描述】:

C++ 中是否有内置的向量函数来反转向量?

还是只需要手动操作?

【问题讨论】:

    标签: c++ vector stl std


    【解决方案1】:

    为此目的,algorithm 标头中有一个函数 std::reverse

    #include <vector>
    #include <algorithm>
    
    int main() {
      std::vector<int> a;
      std::reverse(a.begin(), a.end());
      return 0;
    }
    

    【讨论】:

    • 你能解释一下如何反转向量的向量吗?我希望 v[0] 与 v[v.size()-1] 交换,并且 v[0][i] 元素的顺序保持不变。这类似于更改行的顺序(如果将向量视为矩阵)。如果一个向量被定义为:vector > v; reverse(v.begin(), v.end()) 不会反转它。 TIA!
    • @VikasGoel 实际上你建议的 sn-p 应该可以工作。也许还有其他问题?
    【解决方案2】:

    所有容器都通过rbegin()rend() 提供其内容的反向视图。这两个函数返回所谓的reverse iterators,可以像普通的一样使用,但看起来容器实际上是反转的。

    #include <vector>
    #include <iostream>
    
    template<class InIt>
    void print_range(InIt first, InIt last, char const* delim = "\n"){
      --last;
      for(; first != last; ++first){
        std::cout << *first << delim;
      }
      std::cout << *first;
    }
    
    int main(){
      int a[] = { 1, 2, 3, 4, 5 };
      std::vector<int> v(a, a+5);
      print_range(v.begin(), v.end(), "->");
      std::cout << "\n=============\n";
      print_range(v.rbegin(), v.rend(), "<-");
    }
    

    Live example on Ideone。输出:

    1->2->3->4->5
    =============
    5<-4<-3<-2<-1
    

    【讨论】:

    • 但是不会就地反转向量。您可以使用 std::vector v2( v1.rbegin(), v1.rend() ); 创建一个新向量v2.swap(v1);这将有效地使用您的解决方案。我看不出使用 std::reverse 在任何方面都更优雅或更有利。
    • @CashCow:嗯,首先,这是一个空操作,它是 O(1)。倒车。。没那么多。大多数时候,您并不真正需要反转容器,您只需要看到它是反转的。事实上,我想不出你真正需要一个无法用反向迭代器解决的反向容器的情况。
    • @CashCow:优雅并不总是真正的优雅。在我职业生涯的大多数情况下,我只需要一个反向视图,而不是一个反向向量。在所有这些情况下,如果您创建更多副本或转换顺序,性能将完全受到不必要的影响。如果您只需要未指定顺序的前 10 个元素,您是否还会 std::sort 一个 1000 元素向量,因为它比 std::partition 更优雅?就像 15 年前一样,这就是今天的思想流派,它削弱了我今天的 PC 体验,不同之处在于浪费了更多周期,数十亿周期。
    • print_range 不正确:超过 empty 范围时将不起作用。
    • 所以最大的问题是,std::reverse(a.rbegin(), a.rend()) 会做什么? ;^)
    【解决方案3】:

    你可以像这样使用std::reverse

    std::reverse(str.begin(), str.end());
    

    【讨论】:

      【解决方案4】:

      您想要反转向量的原因通常是因为您通过在最后推动所有项目来填充它,但实际上是以相反的顺序接收它们。在这种情况下,您可以使用deque 来反转容器,并将它们直接推到前面。 (或者您可以使用vector::insert() 在前面插入项目,但是当有很多项目时,这会很慢,因为每次插入都必须将所有其他项目随机排列。)所以相对于:

      std::vector<int> foo;
      int nextItem;
      while (getNext(nextItem)) {
          foo.push_back(nextItem);
      }
      std::reverse(foo.begin(), foo.end());
      

      你可以这样做:

      std::deque<int> foo;
      int nextItem;
      while (getNext(nextItem)) {
          foo.push_front(nextItem);
      }
      // No reverse needed - already in correct order
      

      【讨论】:

        【解决方案5】:

        您也可以使用std::list 代替std::vectorlist 有一个内置函数 list::reverse 用于反转元素。

        【讨论】:

        • std::list 在将许多元素插入序列中的任意位置的唯一特定情况下应该优先于向量。在向量上使用 std::list 只是因为您将反转序列在性能方面是一个坏主意。
        【解决方案6】:
        #include<algorithm>
        #include<vector>
        #include<iostream>
        using namespace std;
        int main()
        {
            vector<int>v1;
            for(int i=0; i<5; i++)
                v1.push_back(i*2);
            for(int i=0; i<v1.size(); i++)
                cout<<v1[i];    //02468
            reverse(v1.begin(),v1.end());
            
            for(int i=0; i<v1.size(); i++)
                cout<<v1[i];   //86420
        }
        

        【讨论】:

        • 这个有八年历史的问题是否需要另一个没有添加的重复答案?
        猜你喜欢
        • 1970-01-01
        • 2020-11-06
        • 1970-01-01
        • 2013-09-26
        • 2020-10-27
        • 1970-01-01
        • 2016-05-17
        • 2014-04-17
        • 1970-01-01
        相关资源
        最近更新 更多