2017-02-15 82 views
0

我想寫一個函數,它需要兩個向量並將它們合併在一起,來回交替(即v1 = 1,2,3 v2 = 4,5,6會產生v3 = 1,4 ,2,5,3,6)。問題是,當我運行我的函數時,我得到一個錯誤,說'矢量迭代器是不兼容的'。從我的研究中,我認爲它與我使用.begin()和.end()函數有關,但是由於我僅僅在這幾個月內就看到了,所以我不知道如何修復它。注意:NULL上的push_back是在向量中留下一個空白空間。迭代器不兼容錯誤

下面的代碼:

void merge(vector<double> x, vector<double> y, vector<double>& merged) { 
    auto xStart = x.begin(); 
    auto yStart = y.begin();   

    while (xStart != x.end() && yStart != x.end()) { 
     merged.push_back(*xStart); 
     merged.push_back(*yStart); 
     ++xStart; 
     ++yStart; 
    } 
    if (xStart != x.end()) { 
     while (xStart!= x.end()) { 
      merged.push_back(*xStart); 
      merged.push_back(NULL); 
      ++xStart; 
     } 
    } 
    if (yStart != y.end()) { 
     while (yStart != y.end()) { 
      merged.push_back(*yStart); 
      merged.push_back(NULL); 
      ++yStart; 
     } 
    } 
} 
+0

'yStart!= x.end( )''''''''''yStart!= y.end()' –

+0

如果您在調試器下運行您的代碼,您會發現調試器指示了線路連接保留錯誤 –

+0

'push_back(NULL)'是一個錯誤(可能無法在較新的編譯器上編譯),請改用'push_back(0.0)'。 「如果(X)while(X)'是多餘的,你可以直接進入'while'。 –

回答

1

有一個錯字

while (xStart != x.end() && yStart != x.end()) { 
             ^^^^^^ 

必須有

while (xStart != x.end() && yStart != y.end()) { 
             ^^^^^^^ 

而且這種說法

merged.push_back(NULL); 

沒有意義。

而且它好得多聲明函數像

void merge(const vector<double> &x, const vector<double> &y, vector<double>& merged); 

這裏是一個示範項目

#include <iostream> 
#include <vector> 

template <typename T> 
void merge(const std::vector<T> &x, 
      const std::vector<T> &y, 
      std::vector<T> &merged) 
{ 
    merged.reserve(merged.size() + x.size() + y.size()); 

    auto xStart = x.begin(); 
    auto yStart = y.begin();   

    for (; xStart != x.end() && yStart != y.end(); ++xStart, ++yStart) 
    { 
     merged.push_back(*xStart); 
     merged.push_back(*yStart); 
    } 


    for (; xStart != x.end(); ++xStart) 
    { 
     merged.push_back(*xStart); 
    } 

    for (; yStart != y.end(); ++yStart) 
    { 
     merged.push_back(*yStart); 
    } 
} 

int main() 
{ 
    std::vector<int> v1 = { 0, 2, 4, 6, 8 }; 
    std::vector<int> v2 = { 1, 3, 5, 7, 9 }; 

    std::vector<int> merged; 

    merge(v1, v2, merged); 

    for (int x : merged) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

它的輸出是

0 1 2 3 4 5 6 7 8 9 
+0

謝謝你的幫助!出於好奇,爲什麼將它們作爲常量更好地發送給函數呢? – Sandweiche

+0

@Sandweiche它們通過常量引用傳遞。這允許1)避免創建向量的副本,並且2)保證源向量在函數中不被改變。 –

+0

我猜測原始代碼試圖填充較短的向量,例如'{1,2,3} + {4} = {1,4,2,0,3,0}' –