C++ 在第一维度的std::vectors的std::vectors中写入
我有一个std::vector的std::vector,我想使用for循环将一个元素推回到每个内部向量。代码看起来是这样的,但显然不起作用,因为不能以这种方式访问每个向量矩阵[i]=和第8行生成分段错误 因此,我想按列编写元素。对我来说,按行编写不是一个选项,因为我需要使用一些外部函数,这些函数期望元素按该顺序排列 我认为解决方案包括使用指针的向量std::vector,但我想知道是否有可能只使用向量,因为这样可以简化事情C++ 在第一维度的std::vectors的std::vectors中写入,c++,vector,stl,C++,Vector,Stl,我有一个std::vector的std::vector,我想使用for循环将一个元素推回到每个内部向量。代码看起来是这样的,但显然不起作用,因为不能以这种方式访问每个向量矩阵[i]=和第8行生成分段错误 因此,我想按列编写元素。对我来说,按行编写不是一个选项,因为我需要使用一些外部函数,这些函数期望元素按该顺序排列 我认为解决方案包括使用指针的向量std::vector,但我想知道是否有可能只使用向量,因为这样可以简化事情 此外,如果解决方案不涉及C++11或更高版本的功能,这将是最好的,因为我
此外,如果解决方案不涉及C++11或更高版本的功能,这将是最好的,因为我必须保持向后兼容性。但是,如果您有一个使用C++11或更高版本的答案,您仍然可以为任何其他可能觉得有用的人编写它。如果您计算并推送行而不是列,会更容易。但是,这里有一个解决方案,因为您已经知道矩阵的大小:
std::vector<std::vector<float> > matrix(number_of_rows, std::vector<float>(number_of_columns, float()));
for (size_t j = 0; j < number_of_columns; ++j) {
vector<float> elements_to_push = compute_elements();
for (size_t i = 0; i < number_of_rows; ++i) {
matrix[i][j] = elements_to_push[i];
}
}
我建议在行主配置中围绕单个std::vector创建一个包装器来表示矩阵,这样比使用2D std::vector更方便。以下内容应该与c++11之前的版本兼容,这就是为什么我没有使用auto和其他一些c++11以后的功能
template<typename Ty>
class matrix {
// enables use of [][] on matrix objects
class proxy_row_vector {
public:
proxy_row_vector(std::vector<Ty>& _vec, std::size_t cols, std::size_t row_ind)
: vec(_vec), columns(cols), row_index(row_ind) {}
const Ty& operator[](std::size_t col_ind) const {
return vec[row_index*columns + col_ind];
}
Ty& operator[](std::size_t col_ind) {
return vec[row_index*columns + col_ind];
}
private:
std::vector<Ty>& vec;
std::size_t row_index;
std::size_t columns;
};
public:
// construct rows*cols matrix with default-inserted Ty instances
explicit matrix(std::size_t rows, std::size_t cols)
: mtx(rows*cols), rows_(rows), cols_(cols) {}
std::size_t rows() const { return rows_; }
std::size_t columns() const { return cols_; }
// used for const [][] access
proxy_row_vector operator[](std::size_t row_ind) const {
return proxy_row_vector(mtx, cols_, row_ind);
}
// used for mutable [][] access
proxy_row_vector operator[](std::size_t row_ind) {
return proxy_row_vector(mtx, cols_, row_ind);
}
// insert a new row at the end
void push_row(const std::vector<Ty>& row_vec) {
for (std::vector<Ty>::iterator it = row_vec.begin(); it < row_vec.end(); ++it)
mtx.push_back(*it);
++rows_;
}
// insert a new column at the end
void push_column(const std::vector<Ty>& col_vec) {
insert_column(cols_, col_vec);
}
// insert a row at indicated position
void insert_row(size_type row_pos, const std::vector<Ty>& row_vec) {
mtx.insert(mtx.begin() + row_pos*cols_, row_vec.begin(), row_vec.end());
++rows_;
}
// insert a column at indicated position
void insert_column(size_type col_pos, const std::vector<Ty>& col_vec) {
for (std::size_t i = 0; i < col_vec.size(); ++i) {
mtx.insert(mtx.begin() + i*(cols_+1)+col_pos,col_vec[i]);
}
++cols_;
}
private:
std::vector<Ty> mtx;
std::size_t rows_;
std::size_t cols_;
};
然后,使用您的示例推送一个新列很简单:
matrix<float> mat;
std::vector<float> column_to_push = compute_elements();
mat.push_column(column_to_push);
注意:在上面的矩阵类中,没有边界或大小检查,因为这是此类的一个最小示例。您应该在行/列插入方法中添加大小检查,以避免尝试推送的行向量或列向量分别超过或低于矩阵的当前列数或行数。此外,您可能希望通过std::vector迭代器和其他方法(例如,删除行/列)添加迭代器支持的琐碎功能。仅使用matrix.push\u backelements\u to\u push;没有大小为i=0的循环;i<行数++我{甚至是矩阵。推回计算元素;@DimChtz为什么不把它写下来作为答案?@JoachimPileborg我相信其他人会这样做:这不就是在矩阵中推一行吗?我会测试它,但这是我的信念,我没有尝试。@Grey外部循环是必要的,内部循环不是那么多。
matrix<float> mat;
std::vector<float> column_to_push = compute_elements();
mat.push_column(column_to_push);