Я думаю, что этот вопрос строится на Вектор преобразования 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); в коде.
Пока существует неявное правило преобразования между примитивами int
а также double
типы, нет между std::vector<int>
а также std::vector<double>
,
На самом деле, нет никакой связи между этими двумя типами с точки зрения иерархии классов.
Краткий ответ: используйте цикл и продолжайте ;-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
….