Инициализация вектора С++ 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});
}
Может кто-нибудь объяснит мне разницу? Как я могу выполнить ярлык, который я пытаюсь сделать во втором главном()?
Ответы
Ответ 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;
}