std :: vector: непрерывные данные и копирование / перемещение

У меня есть два вопроса для следующего кода: 1) Будут ли элементы faces быть смежным?
2) Есть ли std::vector скопировать или переместить Face f при вставке?

#include <vector>
int main()
{
struct Face {};
std::vector<Face> faces;

for (int i=0; i<10; ++i)
{
Face f;

faces.push_back (f);
}

return 0;
}

9

Решение

Согласно стандарту § 23.3.6.1 Обзор вектора шаблона класса [vector.overview]:

Элементы vector хранятся смежно, это означает, что если v это vector<T, Allocator> где T это какой-то тип, кроме boolтогда он подчиняется личности &v[n] == &v[0] + n for all 0 <= n < v.size(),

Что касается вашего второго вопроса в предыдущих компиляторах C ++ 11 push_back скопировал бы объект, который вы нажимаете.

После C ++ 11 это зависит от того, push_back имеет две перегрузки, одна из которых принимает lvalue ссылка и еще один, который занимает rvalue ссылка.

В вашем случае он будет скопирован, потому что вы передаете объект как lvalue, Для обеспечения движения объекта вы можете использовать std::move(),

faces.push_back(std::move(f));
18

Другие решения


По вопросам рекламы [email protected]