2013-04-13 31 views
-1

到目前爲止,這是我的代碼,我想要做的是說我輸入1 2 3的第一個向量和 9 8 7爲第二個向量,我想它打印我們的1 9 2 8 3 7.但我無法弄清楚,有人能指引我走向正確的方向。先謝謝你。合併向量

#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

vector<int> append(vector<int> a, vector<int> b) 
{ 
    int n = a.size(); 
    int m = b.size(); 
    vector<int> c(n + m); 
    int i; 

    for (i = 0; i < n; i++) 
     c[i] = a[i]; 

    for (i = 0; i < m; i++) 
     c[n + i] = b[i]; 

    return c; 
} 

vector<int> merge(vector<int> a, vector<int> b) 
{ 
    int n = a.size(); 
    int m = b.size(); 
    vector<int> c(n + m); 
    int i; 

    for (i = 0; i < n; i++) 
     c[i] = a[i]; 

    for (i = 0; i < m; i++) 
     c[n + i] = b[i]; 

    return c; 
} 

vector<int> merge_sorted(vector<int> a, vector<int> b) 
{ 

    int n = a.size(); 
    int m = b.size(); 
    vector<int> c(n + m); 
    int i; 

    for (i = 0; i < n; i++) 
     c[i] = a[i]; 

    for (i = 0; i < m; i++) 
     c[n + i] = b[i]; 

return c; 
} 

int main() 
{ 
    cout << "Please enter a set of numbers, insert -1 when done.\n"; 
    vector<int>a; 
    bool more = true; 
    while (more) 
    { 
     int n; 
     cin >> n; 
     if (n == -1) 
      more = false; 
     else 
      a.push_back(n); 
    } 


    cout << "Please enter another set of numbers, insert -1 when done.\n"; 
    vector<int>b; 
    more = true; 
    while (more) 
    { 
     int m; 
     cin >> m; 
     if (m == -1) 
     more = false; 
     else 
     b.push_back(m); 
    } 

    vector<int>d = append(a,b); 
    { 

     int i; 
    cout << "Appended: "; 
     for (i= 0; i < d.size(); i++) 

     cout << d[i] << " "; 
    cout << "\n"; 
} 

vector<int>r = merge(a,b); 
{ 
    cout << "Merged: "; 

    vector<int> all_nodes(a.size() + b.size()); 

    sort(a.begin(), a.end()); 
     sort(b.begin(), b.end()); 

     merge(a.begin(), a.end(), b.begin(), b.end(), all_nodes.begin()); 
    cout << "\n"; 
} 

    vector<int>z = merge_sorted(a,b); 
{ 

    a.insert(a.end(), b.begin(), b.end()); 
    sort(a.begin(), a.end()); 

     cout << "Sorted: "; 

    for (vector<int>::iterator it = a.begin(); it != a.end(); ++it) 
     cout << *it << " "; 
    } 
} 

回答

2
Assuming both the vectors of same size 

vector<int> vec1; 
vector<int> vec2; 
vector<int> result; 

vec1.push_back(1); 
vec1.push_back(2); 
vec1.push_back(3); 

vec2.push_back(7); 
vec2.push_back(8); 
vec2.push_back(9); 

int nsize = vec1.size();//Take any one vector; 
int j = 0; 
for(int i=0;i<nsize;i++) 
{ 
    result.push_back(vec1[i]); 
    result.push_back(vec2[i]); 
} 
+0

這不會像寫入那樣工作,result.size()仍然爲零。您可能需要在循環前改變循環來使用'.push_back()'或調用'result.resize(2 * nsize);'。 – SirGuy

+0

做一個push_back導致vec ... – shivakumar

1

您的合併代碼正是與您的附加代碼。這是如何工作的?你還沒有考慮過的另一個問題是,當你有不等大小的向量時,合併是如何工作的。直到你問自己這個問題,你才能解決這個問題。

像這樣的東西可能是你需要的東西。重要的區別是隻有一個循環。另一個區別是我使用push_back來構建向量,而不是試圖預先計算它的大小。這對我認爲的這個算法來說更自然一些。

vector<int> merge(vector<int> a, vector<int> b) 
{ 
    int n = a.size(); 
    int m = b.size(); 
    vector<int> c; 
    int i; 

    for (i = 0; i < n || i < m; i++) 
    { 
     if (i < n) 
      c.push_back(a[i]); 
     if (i < m) 
      c.push_back(b[i]); 
    } 
    return c; 
} 
+0

你仍然可以使用'c.reserve(n + m)'來避免過度的重新分配 – TemplateRex

+0

@rhalbersma,是的好點 – john

+1

並且保持'i'本地到循環, a和'b'由const引用 – TemplateRex