Is vector :: push_back () makes a shallow copy and how to solve it

In the program I'm writing, I have something similar to the code here:

#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:; } } } 

As you can see, I am returning a structure ( people youngling ) to a vector ( vector<people> master ). However, this code gives me the wrong results, and I think it could be caused by a structure and small copy problem. This is somewhat proven, because if I use the full array of people to store input, then the answer is correct. But I am puzzled by this:

  • Is the struct just a pointer to the compiler or why does this small copy problem exist?
  • I declare people youngling inside the inner loop, hoping to solve this problem, but not use it. Is there an easy way to fix the code snippet above?
  • When I test small cases using GCC 4.4, the answer seems to be correct. However, when I test it, use gnu C ++ 0X, the answer is incorrect. Is this a problem for the compiler?

Note. I cannot provide the wrong test case, as I test it online using the judges system.

+4
source share
1 answer

push_back makes a copy of the object inserted using its copy constructor. If there is no custom one (for example, in the case of your structure), by default you just need to copy all the fields using your own copy constructors, etc.

For your structure containing a string and a fixed size array of fundamental type, the result should be equivalent to a deep copy.

+12
source

All Articles