C++ 二维std::vector中的Set元素

C++ 二维std::vector中的Set元素,c++,multidimensional-array,std,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

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

    }
}
//从main调用
矩阵*matrixA=新矩阵(5,5);
矩阵->显示元素();
matrixA->setElement(2,2,40.0);
矩阵->显示元素();
//矩阵类
std::vector>容器;
void矩阵::setElement(长atRow、长atColumn、双值)
{
对于(inti=0;inumberOfColumns;i++)
{
std::vector row=this->container.at(i);
for(int j=0;jnumberOfRows;j++)
{
如果((j==atRow)和&(i==atColumn))
{
//std::vector column=this->container.at(i);
行插入(行开始()+j,值);

嘿,弗拉基米尔·斯塔希洛夫

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

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

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

 }
}
这是我几周前问的一个类似的问题。我希望它能有所帮助


嘿,弗拉基米尔·斯塔希洛夫

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

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

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

 }
}
这是我几周前问的一个类似的问题。我希望它能有所帮助


您不需要任何循环。通过
操作符[]提供元素访问。
因此,如果向量具有正确的尺寸,您可以如下设置元素:

void Matrix::setElement(long atRow, long atColumn, double value)
{
    container[atRow][atColumn] = value;
}
此运算符不执行边界检查,因此如果使用无效索引调用它,则会得到未定义的行为。还有一个成员函数
at()
,用于检查边界并引发越界访问异常。因此,您可以使用它:

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

您不需要任何循环。通过
操作符[]
提供元素访问。因此,如果向量具有正确的维度,您可以如下设置元素:

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 );
} 
如果(atRow>=0&&atRownumberOfRows&&
atColumn>=0&&atColumnnumberOfColumns)
{
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;
} 
如果(atRow>=0&&atRownumberOfRows&&
atColumn>=0&&atColumnnumberOfColumns)
{
此->容器[atRow][atColumn]=值;
} 

如果要在变量atRow和atColumn指定的位置插入新元素

然后你可以用下面的方法来做

if ( atRow >= 0 && atRow < this->numberOfRows &&
     atColumn >= 0 && atColumn < this->numberOfColumns )
{
    this->container[atRow].insert( this->container[atRow].begin() + atColumn, value );
} 
如果(atRow>=0&&atRownumberOfRows&&
atColumn>=0&&atColumnnumberOfColumns)
{
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;
} 
如果(atRow>=0&&atRownumberOfRows&&
atColumn>=0&&atColumnnumberOfColumns)
{
此->容器[atRow][atColumn]=值;
} 

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

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;
    }
} 
typedef向量矩阵;
typedef vector::size_type mat_size;
空隙变化垫(矩阵和垫,垫尺寸i,垫尺寸j,双val){

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

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;
    }
} 
typedef向量矩阵;
typedef vector::size_type mat_size;
空隙变化垫(矩阵和垫,垫尺寸i,垫尺寸j,双val){

如果(i <代码>容器[ATRO] [AtStal]=Value;< /Cord>),虽然与问题不直接相关,但您应该考虑使用智能指针(<代码> STD::UNQuijyPTR 或<代码> STD::SyrdYPPTR < /代码>)要管理
矩阵
对象。@AlejandroLucena为什么要使用指针?@juanchopanza他可能有理由在堆上分配
矩阵
(而不是
std::vector
)“JuangPopaZa”也许没有一个很好的理由,你是完全正确的。但是在有一个很好的理由的情况下,我只是建议使用UnQuyPPTR/SyrdypTR来手动管理对象<代码>容器[ATRO] [AtStal]=Value;< /Cord> >虽然与问题不直接相关,但应该考虑使用智能指针。(
std::unique_ptr
std::shared_ptr
)来管理
矩阵
对象。@AlejandroLucena为什么要使用指针?@juanchopanza他可能有理由在堆上分配
矩阵
(而不是
std::vector
)@juanchopanza也许没有什么好的理由,你是绝对正确的。但如果有好的理由,我只是建议使用unique_ptr/shared_ptr而不是手动管理对象。你到底为什么需要两个for循环?你到底为什么需要两个for循环?