簡體   English   中英

以相反的順序打印矢量

[英]Printing vector in reverse order

有沒有更好的方式以相反的順序打印矢量然后這個:

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

void print_elem(int elem)
{
    cout << elem << endl;    
}

int main()
{
    int ia[4]={1,2,3,4};
    vector<int> vec(ia,ia+4);
    reverse(vec.begin(), vec.end());
    for_each(vec.begin(),vec.end(),print_elem);
    reverse(vec.begin(), vec.end());
}

您可以使用反向迭代器:

for_each(vec.rbegin(),vec.rend(),print_elem);

有很多方法可以在不反轉元素的情況下反向打印雙向序列,例如:

std::copy(vec.rbegin(), vec.rend(), std::ostream_iterator<int>(std::cout, "\n"));
std::reverse_copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "\n"));

使用reverse_iterator而不是iterator

int main()
{
    int ia[4]={1, 2, 3, 4};
    vector<int> vec(ia,ia+4);
    for(vector<int>::reverse_iterator it = vec.rbegin; it != vec.rend(); ++it)
    {
        std::cout << *it << std::endl;
    }
}

輸出將是:4, 3, 2, 1

有很多方法可以做到 這一點。我只解釋一種,更多可以在 這個鏈接中看到。

使用常量反向迭代器(crbegin):

反向迭代器向后迭代,即增加它們會將它們移向容器的開頭。

為了檢查我們是否到達了起點,我們可以使用迭代器變量(在我的例子中為 x)與 crend(返回向量的起點)進行比較。記住這里的一切都是相反的!

下面是一個簡單的實現:

for(auto x = vec.crbegin() ; x!=vec.crend() ; x++){
        cout<<*x<<" ";
}

在 C++20 中,您可以使用在range 庫中找到並由 gcc 10支持views::reverse

#include <iostream>
#include <vector>
#include <ranges>

int main()
{

        std::vector V{0, 1, 2, 3, 4, 5, 6, 7};
        for (auto v : V | std::views::reverse)
        {
                std::cout << v << " ";
        }
        return 0;
}

輸出是:

7 6 5 4 3 2 1 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM