Подтвердить что ты не робот

Инициализация вектора С++ 11 в вызове функции

У меня вопрос о новом ярлыке для определения векторов в С++ 11. Предположим, что у меня есть следующий класс

struct Tester{

  vector< vector<int> > data;

  Tester(){
    data = vector< vector<int> >();
  }

  void add(vector<int> datum){
    data.push_back(datum);
  }

};

Затем выполняется следующее:

int main(){
    Tester test = Tester();
    vector<int> datum = vector<int>{1,2,3};
    test.add(datum);
}

но это не так:

int main(){
    Tester test = Tester();
    test.add(vector<int>{1,2,3});
}

Может кто-нибудь объяснит мне разницу? Как я могу выполнить ярлык, который я пытаюсь сделать во втором главном()?

4b9b3361

Ответ 1

Ваш код выглядит нормально, но используемый вами компилятор не является (который кажется старым).

Кстати, вы слишком много делаете.

Этого должно быть достаточно:

vector<int> datum{1,2,3}; //initialization

test.add({1,2,3}); //create vector<int> on the fly and pass it to add()

Не забудьте обновить свой компилятор.

Кроме того, строка data = vector< vector<int> >(); тоже слишком велика. Это не нужно. Вектор создается автоматически, что означает, что вы можете оставить конструктор своего класса пустым или вообще не иметь его, поскольку он ничего не делает.

Ответ 2

Если вы хотите избежать копирования данных:

#include <vector>
#include <iostream>

using namespace std;

struct Tester
{
    vector< vector<int> > data;

    Tester()
    {
        data = vector< vector<int> >();
    }

    void add(vector<int> && datum)
    {
        data.push_back(std::move(datum));
    }

};


int main()
{
    Tester test = Tester();
    test.add(vector<int>{1,2,3});

    for(const auto &v : test.data[0])
        std::cout << v << std::endl;
}