在二维std :: vector中设置元素

时间:2015-01-05 10:27:18

标签: c++ multidimensional-array std

我必须在(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;
            }
        }

    }
}

4 个答案:

答案 0 :(得分:2)

您不需要任何循环。 std::vector通过operator[]提供元素访问权限。因此,如果您的矢量具有正确的尺寸,您可以设置如下元素:

void Matrix::setElement(long atRow, long atColumn, double value)
{
    container[atRow][atColumn] = value;
}

此运算符不执行边界检查,因此如果使用无效索引调用它,则会得到未定义的行为。还有一个成员函数at(),它检查边界并引发越界访问的异常。你可以这样使用它:

container.at(atRow).at(atColumn) = value;

答案 1 :(得分:1)

如果要在变量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;
} 

答案 2 :(得分:1)

如果你想避免捕获异常(无论出于何种原因),另一种方法是自己检查边界,但也不需要使用循环。 例如:

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中所看到的那样,糟糕的访问权限将会无声地失败(不是说它是更好的方式,但它是另一种有效的方式,我不确定你追求的是什么。

答案 3 :(得分:0)

Hey Vladimir Staxhilov。

向向量添加内容的最简单方法是让两个for循环遍历向量,然后只添加内容。例如。

for(int row=0...){
 for(int col=0...){

   if((row==atRow) && (col == atColumn)){
     container[row][col] = "value";
   }

 }
}

这是几个星期前我问过的类似问题。我希望它有所帮助。

THE LINK