C++中的构造向量查询

Const vector query in C++

本文关键字:向量 查询 C++      更新时间:2023-10-16
  #include < vector >
 using namespace std;
 class Rclass
 {
 public:
       vector<int> ir0T;
       vector<int> ir1T;
 private:
      int f();
 }

 int Rclass::f()
 {
           ir0T.clear();
           ir1T.clear();
           ir0T.push_back(1);
           ir1T.push_back(2);
 }

这会抛出错误

Rclass.cpp:90:错误:成员函数"clear"不可行:"this"参数的类型为"const vector",但函数未标记为constir0T.clear((;^~~~">

Rclass.cpp:91:错误:成员函数"clear"不可行:"this"参数的类型为"const vector",但函数未标记为constir1T.clear((;">

为什么?^~~~

我尝试添加"const-vvector ir0T;">

不能将矩阵成员变量设置为在局部成员函数中创建的局部变量-当函数结束时,局部变量将被销毁,然后矩阵成员变量将不会指向任何对象。因此,如果您坚持使用原始指针,请使用calloc((,因为它像malloc一样分配内存,然后将其全部设置为零。这样做的主要问题是,你需要一个复制构造函数、赋值运算符和析构函数-如果你能帮助的话,这不是办法。最好使用std::vector<std::vector<int>>,因为所有的动态分配和释放都是隐藏的。另外,如果你提前知道尺寸,你可以预订。如何将"矢量"化版本初始化为零可以在这里看到:初始化二维std::vector

#include <vector>
class CS
{
  private:
    std::vector<std::vector<int> > Rightalpha;
  public:
    void CreateMtrx(int a, int b)
    {
        // Defaults to zero initial value
        Rightalpha = std::vector<std::vector<int> >(a, std::vector<int>(b));
    }
};
int main()
{
    CS cs;
    cs.CreateMtrx(4,4);
    return 0;
};

如果它是固定的,并且您提前知道矩阵有多大,那么一个更好的选择是:您可以直接使用纯数组作为成员变量,而不是使用指向动态分配内存的指针。如果矩阵很小(如4x4(,这将为您提供缓存位置和性能改进。另外,如果您使用的是c++11,您可以在声明处清除数组,并且根本不需要CreateMatrix((成员变量,类似于以下内容:

class CS
{
  private:
    int Rightalpha[4][4] = {};
};
int main()
{
    CS cs;
    return 0;
};

或者,就像其中一条评论所建议的那样,如果你想要一个漂亮的类似STL的数组接口,你可以使用std::array而不是普通数组。这里列出了一些优点:用std::array替换固定大小的数组?

首先介绍一些基本原理。

CreateMtrx()返回时,Rightalpha将变为无效,因为a将销毁。

我建议对变量使用小写字母命名,对类型使用大写字母命名。即rightAlpha而不是Rightalpha以避免与类型混淆。

至于您的实际问题,您可以使用嵌套循环初始化2D阵列:

for(unsigned int i = 0; i < 4; i++)
{
   for(unsigned int j = 0; j < 4; j++)
   {
      rightAlpha[i][j] = 0;
   }
}

最后,当寻求帮助时,"失败"不利于建设性的回答。重要的是要清楚你的预期行为是什么,以及你实际看到的结果是什么。

如果Rightalpha是类的数据成员,则不需要是int**。您可能只是希望它是一个int[4][4],并跳过在创建函数中使用局部变量"a"。

如果您真的希望它是一个指针,只需将其设为int*,并将其与2D数组语法一起使用即可。代替:int a[4][4]; Do:int* a = new [4*4];

我从注释中看到,您不能更改Rightalpha的类型。然后,您将需要进行手动内存管理。您需要使用new运算符初始化int**

您需要在2D阵列中分配每个阵列。

rightAlpha = new int*[4];
for (int i = 0 ; i < 4 ; i++) {
    rightAlpha[i] = new int[4];
}

你可以在这里阅读更多关于多维数组初始化的信息:

如何使用new在C++中声明2d数组?

即使这样做有效,您也需要释放和管理内存,并小心处理手动内存管理的所有陷阱。这就是为什么我强烈建议使用std::vector<int>:

struct CS {
    createMatrix() {
        rightAlpha = std::vector<int>(4*4);
    }
 private:
    std::vector<int> rightAlpha;

有了这个解决方案,您就不必担心内存问题,因为std::vector会为您解决这个问题。

如果需要矩阵语义,可以添加一个函数,该函数根据ji的位置返回正确的元素。

int operator()(int i, int j) const {
    return rightAlpha[j+4*i];
}

它可以这样使用:

CS myCs;
myCs(3, 2);