2014-09-24 264 views
1

这是我第一次作为C++初学者在此网站上发布的文章。 我的问题很简单。 编写一个反转向量中元素顺序的函数。例如,1,3,5,7,9变为9,7,5,3,1。逆函数 应产生具有相反序列的新矢量,保持其原始的 矢量不变。C++如何反转向量中元素的顺序?

这是我的代码。当我运行它时,“打印”一词之后没有任何内容。我敢肯定,我在某个地方犯了一个愚蠢而简单的错误,但却搞不清楚。将不胜感激任何help.Cheers。

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

} 
+0

当你通过你的代码调试步骤,会发生什么? – tmyklebu 2014-09-24 06:15:32

+0

请发布[MCVE](http://stackoverflow.com/help/mcve)并删除不相关的代码。你的倒车功能有一个可疑的评论。你在那里做什么?另外,向量具有反向迭代器。和构造函数采用迭代器对。 – juanchopanza 2014-09-24 06:16:22

+0

可能的重复[如何反转C++向量?](http://stackoverflow.com/questions/8877448/how-do-i-reverse-ac-vector) – rold2007 2016-05-10 23:28:34

回答

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

这中间位i <= 0延续条款,必须是真实循环迭代。除非您的媒介为空或尺寸为一,否则这种情况永远不会发生,在这种情况下,当您尝试访问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++,你应该这样做。没有什么比将语言半转换为语言更糟了:-)

+0

我知道它!!非常感谢! – 2014-09-24 06:21:53

+2

更多信息 - 当vector为空时(因为'v1.size()'是一个无符号的'size_t'),这个循环没有很好的定义。编写循环的一个更可靠的方法(如果你不想使用反向迭代器当然)是for(size_t i = v1.size(); i--;)'。 – 2014-09-24 06:24:05

+1

谢谢,@Matt,我根据你的建议做了一些修改,由于我自己的编程偏见,做了一些小的修改:-) – paxdiablo 2014-09-24 06:36:46

-1

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

喜欢的东西:

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

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

注意要求:“反向函数应该产生一个具有相反序列的新矢量,保持其原始矢量不变。“ – 2014-09-24 07:21:02

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

您是否将值v按值传递? – 2014-09-24 07:21:33

+1

@Robert Mutke是的,因为你应该保持原始矢量不变,因此我做了一个副本。 – TNA 2014-09-24 08:15:53

+0

使用''reverse_copy''然后 – 2014-09-24 08:43:04

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)的好地方,而不是长型的位置:

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