Как я могу push_back / скопировать объект пользовательского типа (массив) в вектор? - PullRequest
0 голосов
/ 08 апреля 2020

Вот фрагмент моего кода, в котором я объявляю foo:

typedef pair<a, b> foo[8][8];

Я написал функцию, которая копирует объекты этого типа:

copy(foo1, foo2);

скопирует foo2 в foo1 , foo1 и foo2 относятся к типу foo. Кроме того, у меня есть этот вектор:

vector<foo> lst;

Я хотел бы иметь удобный доступ к нему, то есть lst [0][0][0].first будет объектом типа a. Как я могу скопировать объект foo в этот вектор (lst)? Я пытался сделать это так:

lst.push_back( new foo );
copy(lst[lst.size() - 1], foo1);

Как я могу сделать такую ​​вещь?

1 Ответ

2 голосов
/ 08 апреля 2020

std::vector<foo> означает «вектор значений foo», вы не можете push_back(new foo) войти в него, так как new foo является указателем (foo*). Вам потребуется push_back(foo{}), который по умолчанию создает экземпляр foo (значение). Это не работает, потому что:

  • std::vector<T>::push_back требует , что T равно MoveInsertable (в данном конкретном случае)
  • foo - это C -массив, а C -рассылки не MoveInsertable

В общем случае C -массивы плохо работают с std::vector. Вместо этого вы можете использовать std::array, потому что это MoveInsertable .

#include <vector>
#include <array>
#include <iostream>

using foo = std::array<std::array<std::pair<float, float>, 8>, 8>;

std::vector<foo> v;
v.push_back(foo{});
std::cout << v[0][0][0].first << "\n";

В этом случае вам не нужна ваша функция copy, так как std::array будет выполнять копирование

Live Demo

...