двумерное векторное приведение типов

Я думаю, что этот вопрос строится на Вектор преобразования C ++<ИНТ> к вектору<двойной>

Я пытаюсь преобразовать двумерный вектор (хранящийся в объекте) типа int в двумерный вектор типа double. Согласно предоставленной мною ссылке,

std::vector<int> intvec;
std::vector<double> doubvec(intvec.begin(),intvec.end());

следует типизировать исходный вектор (он делает).

Так почему не работает следующий код?

std::vector<std::vector<double>> rotmat(Mesh.matrix.begin(),Mesh.matrix.end());

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

std::vector<double> dubvec(Mesh.matrix[0].begin(), Mesh.matrix[0].end());

Сетка определяется:

class MeshOut
{
public:

MeshOut();MeshOut(vector < vector < int >>, vector < vector < int >>, int, int, double, int, bool);

vector<vector<int>> matrix;
vector<vector<int>> lv_mat;
int shortNum;
int SourceNum;
double smallestMeshSize;
int factor;
bool Fine;
....

Я называю Meshout Mesh (x, y, z, i, j, k, l); в коде.

1

Решение

Пока существует неявное правило преобразования между примитивами int а также double типы, нет между std::vector<int> а также std::vector<double>,

На самом деле, нет никакой связи между этими двумя типами с точки зрения иерархии классов.

1

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

Краткий ответ: используйте цикл и продолжайте ;-P

Длинный ответ: вы можете избежать петли, если сделаете все возможное, чтобы сделать это.

vector Конструктор, который вы используете, принимает пару итераторов: поскольку он повторяется, он в основном заполняет vector с последовательным element_type(*iterator)с, так что element_type должны быть построены из единственного разыменованного значения итератора. Чтобы построить vector<vector<double>>, итераторы должны получить значения, из которых vector<double>с может быть косвенным образом построен. в cppreference векторные документы, потенциально полезные конструкторы:

  • vector(const vector&)

  • vector(vector&&)

  • vector(std::initializer_list<T> init, const Allocator& = Allocator())

Из них первые два должны быть предварительно vector<double> объекты, но последнее немного интереснее. Как твой Mesh пользовательский тип, и вы создаете тип итератора, который при разыменовании создает std::initializer_list<double> объекты, вырезанные из последовательных vector<int> в .matrixтогда вы могли бы поддержать vector<vector<double>> Синтаксис конструкции вы пробовали. std::initializer_list<T>Тогда они фактически являются временными, которые невозможно оптимизировать, но то же самое верно, если вы копируете std::vector<double> вокруг после использования одного явного цикла. Если вы действительно заботитесь об эффективности, профилируйте и сравните с использованием вложенных циклов, используя reserve а также push_back….

0