Является ли vector :: push_back () копией и как это решить? - PullRequest
4 голосов
/ 16 июля 2011

В программе, которую я пишу, у меня есть что-то похожее на код здесь:

#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) в вектор (* 1005)*).Однако этот код дает мне неправильные результаты, и я думаю, что это может быть вызвано структурой и проблемой мелкого копирования.Это несколько доказано, поскольку, если я буду использовать полный массив people для хранения ввода, ответ будет правильным.Но я озадачен этим:

  1. Является ли struct просто указателем на компилятор, или почему существует эта проблема поверхностного копирования?
  2. Я объявляю people youngling внутри внутреннегоЦикл, надеясь решить эту проблему, но бесполезно.Есть ли какой-нибудь простой способ исправить приведенный выше фрагмент кода?
  3. Когда я тестирую небольшие случаи с использованием GCC 4.4, ответ кажется правильным.Однако, когда я тестирую его с использованием gnu C ++ 0X, ответ неверный.Это проблема, связанная с компилятором?

Примечание: я не могу предоставить неправильный контрольный пример, так как я тестирую его онлайн с помощью системы судей.

1 Ответ

14 голосов
/ 16 июля 2011

push_back делает копию вставляемого объекта, используя его конструктор копирования.Если пользовательского нет (как в случае вашей структуры), по умолчанию просто копировать все поля, используя свои собственные конструкторы копирования и т. Д.

Для вашей структуры - содержащей строку и фиксированный размермассив основного типа - результат должен быть эквивалентен глубокому копированию.

...