在二维中设置元素 std::vector
Set element in two dimentional std::vector
我必须替换 (i,j) 位置的元素,但这不起作用。二维中替换对象的正确方法是什么std::vector?
这是我的代码:
//Call from main
Matrix *matrixA = new Matrix(5, 5);
matrixA->displayElements();
matrixA->setElement(2, 2, 40.0);
matrixA->displayElements();
//Matrix class
std::vector < std::vector < double >> container;
void Matrix::setElement(long atRow, long atColumn, double value)
{
for (int i=0; i < this->numberOfColumns; i++)
{
std::vector<double> row = this->container.at(i);
for (int j = 0; j<this->numberOfRows; j++)
{
if((j==atRow) && (i == atColumn))
{
//std::vector<double> column = this->container.at(i);
row.insert(row.begin()+j, value);
std::cout <<row.at(j);
//int i = 0;
}
}
}
}
嗨,弗拉基米尔·斯塔西洛夫。
向向量添加内容的最简单方法是使用两个遍历向量的 for 循环,然后向其中添加内容。例如。
for(int row=0...){
for(int col=0...){
if((row==atRow) && (col == atColumn)){
container[row][col] = "value";
}
}
}
这是我几周前问过的一个类似问题。希望对你有帮助。
您不需要任何循环。 std::vector
通过 operator[]
提供元素访问。因此,只要您的向量具有正确的维度,您就可以像这样设置元素:
void Matrix::setElement(long atRow, long atColumn, double value)
{
container[atRow][atColumn] = value;
}
此运算符不执行边界检查,因此如果您使用无效索引调用它,您会得到未定义的行为。还有一个成员函数 at()
,它检查边界并为越界访问引发异常。您可以这样使用它:
container.at(atRow).at(atColumn) = value;
如果要在变量 atRow 和 atColumn 指定的位置插入新元素
那么你可以按照下面的方式进行
if ( atRow >= 0 && atRow < this->numberOfRows &&
atColumn >= 0 && atColumn < this->numberOfColumns )
{
this->container[atRow].insert( this->container[atRow].begin() + atColumn, value );
}
如果你想替换一个值那么你可以简单地写
if ( atRow >= 0 && atRow < this->numberOfRows &&
atColumn >= 0 && atColumn < this->numberOfColumns )
{
this->container[atRow][atColumn] = value;
}
如果你想避免捕获异常(无论出于何种原因),另一种方法是自己检查边界,但也不需要为此使用循环。
例如:
typedef vector<vector<double>> Matrix;
typedef vector<double>::size_type mat_size;
void changeMat(Matrix &mat, mat_size i, mat_size j, double val){
if(i<mat.size() && j<mat[i].size()){
mat[i][j] = val;
}
}
正如您在此 example 中看到的那样,错误的访问只会无声地失败(并不是说这一定是更好的方法,但这是另一种有效的方法,我不确定您想要什么)。
我必须替换 (i,j) 位置的元素,但这不起作用。二维中替换对象的正确方法是什么std::vector?
这是我的代码:
//Call from main
Matrix *matrixA = new Matrix(5, 5);
matrixA->displayElements();
matrixA->setElement(2, 2, 40.0);
matrixA->displayElements();
//Matrix class
std::vector < std::vector < double >> container;
void Matrix::setElement(long atRow, long atColumn, double value)
{
for (int i=0; i < this->numberOfColumns; i++)
{
std::vector<double> row = this->container.at(i);
for (int j = 0; j<this->numberOfRows; j++)
{
if((j==atRow) && (i == atColumn))
{
//std::vector<double> column = this->container.at(i);
row.insert(row.begin()+j, value);
std::cout <<row.at(j);
//int i = 0;
}
}
}
}
嗨,弗拉基米尔·斯塔西洛夫。
向向量添加内容的最简单方法是使用两个遍历向量的 for 循环,然后向其中添加内容。例如。
for(int row=0...){
for(int col=0...){
if((row==atRow) && (col == atColumn)){
container[row][col] = "value";
}
}
}
这是我几周前问过的一个类似问题。希望对你有帮助。
您不需要任何循环。 std::vector
通过 operator[]
提供元素访问。因此,只要您的向量具有正确的维度,您就可以像这样设置元素:
void Matrix::setElement(long atRow, long atColumn, double value)
{
container[atRow][atColumn] = value;
}
此运算符不执行边界检查,因此如果您使用无效索引调用它,您会得到未定义的行为。还有一个成员函数 at()
,它检查边界并为越界访问引发异常。您可以这样使用它:
container.at(atRow).at(atColumn) = value;
如果要在变量 atRow 和 atColumn 指定的位置插入新元素
那么你可以按照下面的方式进行
if ( atRow >= 0 && atRow < this->numberOfRows &&
atColumn >= 0 && atColumn < this->numberOfColumns )
{
this->container[atRow].insert( this->container[atRow].begin() + atColumn, value );
}
如果你想替换一个值那么你可以简单地写
if ( atRow >= 0 && atRow < this->numberOfRows &&
atColumn >= 0 && atColumn < this->numberOfColumns )
{
this->container[atRow][atColumn] = value;
}
如果你想避免捕获异常(无论出于何种原因),另一种方法是自己检查边界,但也不需要为此使用循环。 例如:
typedef vector<vector<double>> Matrix;
typedef vector<double>::size_type mat_size;
void changeMat(Matrix &mat, mat_size i, mat_size j, double val){
if(i<mat.size() && j<mat[i].size()){
mat[i][j] = val;
}
}
正如您在此 example 中看到的那样,错误的访问只会无声地失败(并不是说这一定是更好的方法,但这是另一种有效的方法,我不确定您想要什么)。