2011-07-16 56 views
4

在我寫程序,我有類似這裏的代碼的東西:是矢量::的push_back()進行淺拷貝和如何解決這個

#include<iostream> 
#include<vector> 
#include<cstring> 

using namespace std; 

struct people 
{ 
    string name; 
    int st; 
    int sn[50]; 
}; 

int main() 
{ 
    unsigned int n,ST[10]={25,18,15,12,10,8,6,4,2,1}; 
    vector<people> master; 
    cin>>n; 
    for (int i=0;i<n;i++) 
    { 
     unsigned int m; 
     cin>>m; 
     for (int j=0;j<m;j++) 
     { 
      people youngling; //I am declaring it here, but it doesn't solve the issue 
      string s; 
      cin>>s; 
      for (int l=0;l<master.size();l++) 
      { 
       if (master[l].name.compare(s)==0) 
       { 
        if (j<10) master[l].st+=ST[j]; 
        master[l].sn[j]++; 
        goto loop; 
       } 
      } 
      youngling.name=s; 
      if (j<10) youngling.st=ST[j]; 
      for (int l=0;l<50;l++) youngling.sn[l]=0; 
      youngling.sn[j]++; 
      master.push_back(youngling); 
      loop:; 
     } 
    } 
} 

正如你所看到的,我推將結構(people youngling)返回到向量(vector<people> master)。但是,這段代碼給了我錯誤的結果,我認爲這可能是由結構和淺拷貝問題造成的。這被證明有點,因爲如果我使用一整套people來存儲輸入,那麼答案是正確的。但我對此感到困惑:

  1. 結構只是一個指向編譯器的指針,或者爲什麼存在這個淺拷貝問題?
  2. 我在內循環裏面聲明瞭people youngling,希望能解決這個問題,但是沒用。有沒有簡單的方法來糾正上面的代碼片段?
  3. 當我使用GCC 4.4測試小案例時,答案似乎是正確的。但是,當我測試它使用GNU C++ 0X時,答案是錯誤的。這是編譯器特有的問題嗎?

注:我不能提供錯誤的測試用例,因爲我使用判斷系統在線測試它。

+2

你需要找到一種方法來測試你的代碼,然後再提交它。 –

+0

@Alan:我測試了小案例,但結果和存儲的信息都沒有錯誤。這是我弄糊塗的地方:( –

+1

「gnu C++ 0X」是什麼意思? –

回答

12

push_back正在使用其複製構造函數插入對象的副本。如果沒有自定義的一個(比如你的結構),默認情況是複製所有的字段,使用自己的拷貝構造函數等。

對於你的struct - 包含一個字符串和一個固定大小的數組基本類型 - 結果應該相當於深層複製。