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

时间:2014-09-24 06:13:50

标签: c++ vector

这是我作为C ++初学者在本网站上发表的第一篇文章。 我的问题很简单。 编写一个反转向量中元素顺序的函数。 例如,1,3,5,7,9变为9,7,5,3,I。反向功能 应该产生一个反向序列的新矢量,留下它的原始 矢量不变。

这是我的代码。当我运行它时,没有任何东西出现在" Printing"之后。我很确定我在某处犯了一个愚蠢而简单的错误但却无法弄明白。非常感谢任何帮助。欢呼。

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("`");

}

5 个答案:

答案 0 :(得分:8)

std::vector<int> reverse(std::vector<int>v)
{
  std::reverse(v.begin(),v.end());
  return v;
}

答案 1 :(得分:7)

for(int i=v1.size()-1;i<=0;--i)
//                    ^^^^

中间位i <= 0 continuation 子句,并且必须 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 ++,你应该热心这样做。没有什么比半语言转换更糟糕了: - )

答案 2 :(得分:1)

使用算法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

答案 3 :(得分:0)

您将<=>=混淆。

但使用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中)而不是long类型的好地方:

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());
}

答案 4 :(得分:-1)

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

类似的东西:

Iterator first = vec.begin();
Iterator last = vec.end();

while ((first!=last)&&(first!=--last)) 
{
    std::iter_swap (first,last);
    ++first;
}