C++中的构造向量查询
Const vector query in C++
#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
会为您解决这个问题。
如果需要矩阵语义,可以添加一个函数,该函数根据j
i
的位置返回正确的元素。
int operator()(int i, int j) const {
return rightAlpha[j+4*i];
}
它可以这样使用:
CS myCs;
myCs(3, 2);
- Mongodb c++驱动程序:如何查询元素的数组
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 查询SQLite数据库中的日期
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 查询C 中向量的初始化
- C soci查询到自定义对象的向量
- 使用c++向量按索引查询是否比RocksDB或LevelDB中按键(索引)查询快
- 对 c++ 中向量的查询
- 使用 Qt 从 mysql 查询构造 2D 向量
- C++中的构造向量查询