是否vector::push_back()进行浅拷贝&如何解决这个问题

Is vector::push_back() making a shallow copy & how to solve this

本文关键字:何解决 解决 问题 push vector back 是否 浅拷贝      更新时间:2023-10-16

在我正在编写的程序中,我有类似于这里的代码:

#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测试它时,答案是错误的。这是编译器特有的问题吗?

注意:我不能提供错误的测试用例,因为我正在使用一个法官系统在线测试它。

push_back正在使用复制构造函数复制插入的对象。如果没有自定义的(比如你的struct),默认情况下只是复制所有字段,使用它们自己的复制构造函数等。

对于包含字符串和基本类型的固定大小数组的结构体,result应该等同于深度复制。