C++如何反转矢量中元素的顺序

C++ How to reverse the order of elements in vector?

本文关键字:元素 顺序 何反转 C++      更新时间:2023-10-16

这是我作为C++初学者在这个网站上的第一篇帖子。我的问题很简单。编写一个函数,使向量中元素的顺序相反。例如,1,3,5,7,9变为9,7,5,3,I。反函数应该生成一个具有相反序列的新矢量,保留其原始序列矢量不变。

这是我的密码。当我运行它时,"打印"一词后面没有任何内容。我很确定我在某个地方犯了一个愚蠢而简单的错误,但就是想不通。如果有任何帮助,我将不胜感激。干杯

void reverse_a(const vector<int>&v1, vector<int>&v2)
{
    //this function creates vector2 with the reverse sequence of elements from vector 1

  for(int i=v1.size()-1;i<=0;--i)
  { 
      v2.push_back(v1[i]);
  }
}
void print(const vector<int>&v)
{
    cout<<"Printing"<<endl;
    for(int i=0;i<v.size();++i)
        cout<<v[i]<<",";
    cout<<"n"<<"end of print.n";
}
int main()
{
    vector<int>v1;
    vector<int>v2;
    int input;
    while(cin>>input)
        v1.push_back(input);
    reverse_a(v1,v2);
    print(v2);
    keep_window_open("`");
}
std::vector<int> reverse(std::vector<int>v)
{
  std::reverse(v.begin(),v.end());
  return v;
}
for(int i=v1.size()-1;i<=0;--i)
//                    ^^^^

中间位i <= 0continuation子句,并且必须为true,循环才能迭代。除非你的向量为空或大小为1,否则它永远不会是真的,在这种情况下,当你试图访问v1[-1]时,你会遇到错误。

<=更改为>=


请注意,我也不太喜欢传递要修改的向量(即使是作为参考),因为不能保证函数中不会有什么东西。我认为在函数中创建新的目标向量并将其传递回去更有意义,比如:

#include <iostream>
#include <vector>
using namespace std;
vector<int> reverse_a (const vector<int> &v1) {
    vector<int> v2;
    size_t i = v1.size();
    while (i > 0)
        v2.push_back (v1[--i]);
    return v2;
}
void print (const vector<int> &v) {
    cout << "Printing" << endl;
    for (size_t i = 0; i < v.size(); ++i)
        cout << v[i] << ",";
    cout << "nEnd of print.n";
}
int main (void) {
    int input;
    vector<int> v1;
    while (cin >> input)
        v1.push_back (input);
    vector<int> v2 = reverse_a (v1);
    print (v2);
    return 0;
}

您还会注意到,我已经更改为使用size_t作为索引类型,并进行了调整以确保它不会变为负数。


当然,这一切都是假设你正在尝试学习相对简单的编程概念。专业的C++程序员可能会使用迭代器来填充一个新的向量,如下所示:

vector<int> reverse_a (vector<int> &v1) {
    vector<int> v2;
    vector<int>::iterator it = v1.end();
    while (it != v1.begin())
        v2.push_back (*(--it));
    return v2;
}

或者使用极简主义(除了标准库调用之外,不需要任何函数调用):

vector<int> v2 (v1.rbegin(), v1.rend());

一旦你致力于学习C++,你就应该兴致勃勃地学习。没有什么比半转换到语言更糟糕的了:-)

使用算法reverse。它需要双向迭代器,所以您可以传递begin()end():

int main(void)
{
    std::vector<int> v{1, 2, 3, 4};
    std::cout << "vector: ";
    for (int i: v)
      std::cout << i << ", ";
    std::cout << "n";
    std::reverse(v.begin(), v.end());
    std::cout << "reversed vector: ";
    for (int i: v)
      std::cout << i << ", ";
    std::cout << "n";
    return 0;

}

如果您需要副本,请转到:reverse_copy

您混淆了<=>=

但使用reverse_iterator会使的工作更简单

void reverse_a(const std::vector<int>&v1, std::vector<int>&v2)
{
    v2.clear();
    for (std::vector<int>::const_reverse_iterator it = v1.rbegin(); it != v1.rend(); ++it) {
        v2.push_back(*it);
    }
}

注意:这是一个使用auto(在C++11中)而不是这里的长类型的好地方

for (auto it = v1.rbegin(); it != v1.rend(); ++it)

代码甚至可以简化为:

void reverse_a(const std::vector<int>&v1, std::vector<int>&v2)
{
    v2.assign(v1.rbegin(), v1.rend());
}

您可以尝试使用迭代器交换值。

类似于:

Iterator first = vec.begin();
Iterator last = vec.end();
while ((first!=last)&&(first!=--last)) 
{
    std::iter_swap (first,last);
    ++first;
}