2016-06-21 1 views
3

У меня есть std::vector<vector<double>> Я хочу, чтобы заполнить одну функцию. Мне нужно сохранить некоторые 3-мерные координаты для некоторых вычислений позже в моей программе.с помощью push_back положить вектор <double> в вектор <<double>>

Мой вопрос, если я это сделать:

//in classdefinition 
std::vector<std::vector<double>> data; 

    myFunc() 
    { 
     std::vector<double> temp; 
     temp.push_back(1); 
     temp.push_back(2); 
     temp.push_back(3); 
     data.push_back(temp); 

     temp.clear(); 
     //new data 
     temp.push_back(2); 
     temp.push_back(3); 
     temp.push_back(4); 
     data.push_back(temp); 
    } 

будет клиринг и заправка температуры влияют на значения в данных?

Я уже нашел это http://www.cplusplus.com/reference/vector/vector/push_back/ , но поскольку объяснение гласит: «Содержимое val копируется (или перемещается) в новый элемент». Я не знаю, что думать. Для меня это звучит как противоречие.

Я думаю, что это не имеет большого смысла, если переменные передаются в качестве ссылки, поскольку они могут, как и в моем случае, быть действительными только в ограниченной области. Я прав с моим предположением?

ответ

5

Если data имеет тип std::vector<std::vector<double>>, то вы прекрасно: а значение копия будет принято из temp; поэтому вы можете делать все, как вам угодно, с temp после того, как вы использовали его как аргумент push_back.

Если, однако, вы столкнулись с распределителем вектора, тогда вам, возможно, потребуется проявлять большую осторожность.

Использование заложения (см emplace_back) может устранить ненужную глубокую копию:

// First row of data 
{ 
    std::vector<double> temp = {1, 2, 3}; /*ain't C++11 brilliant?*/ 
    data.emplace_back(std::move(temp)); /*do not use temp after this line - 
           use scope blocks so you're not tempted*/ 
} 

Вы могли сделать это как однострочника хотя на самом деле я подозреваю, вы хотите, чтобы заполнить temp с небольшим больше заботы. Поэтому я сохранил две линии отдельно.

1

Как вы можете видеть в доке есть две перегруженные версии push_back функции

void push_back (const value_type& val); 
void push_back (value_type&& val); 

Первые принимает константную ссылку val и копирует его в вектор. Второй использует ссылку rvalue (см. move sematics для получения дополнительной информации) и перемещаетval в вектор, оставляющий исходный вектор пустой. Ни один из них не сохраняет ссылку на временный объект внутри вектора.

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

std::vector<std::vector<double>> v; 
std::vector<double> lv = {1, 3, 7}; 
v.push_back(lv); 

второй - когда вы передаете временную переменную или явно переместить переменную

v.push_back(std::vector<double>({0, 17, 42})); 
v.push_back(std::move(lv)); 
+0

О, извините, я не видел, что у меня был C++ 98 вместо C++ 11, поэтому я не видел перегруженную функцию и был сбит с толку. – NiKoCh

1

"скопировал" относится к push_back (температура) и "(или перемещен)" относится к push_back (Std :: move (temp))