2014-09-24 73 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