C++从C继承了数组,几乎无处不在.C++提供了易于使用且不易出错的抽象(std::vector<T>自C++ 98和C++ 11std::array<T, n>以来),因此对数组的需求并不像在C中那样频繁出现.但是,当您阅读遗产时代码或与用C编写的库交互,你应该牢牢掌握数组如何工作.
本FAQ分为五个部分:
如果您觉得此常见问题解答中缺少重要内容,请写下答案并将其作为附加部分链接到此处.
在下文中,"数组"表示"C数组",而不是类模板std::array.假定了C声明符语法的基本知识.请注意,面对异常,手动使用new和delete如下所示是非常危险的,但这是另一个常见问题解答的主题.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
你怎么能创建一个2D数组,比如arr[][]5行,每行中的列数可变?
可能arr[5][]
是第一行arr[0][]有4列
第2行arr[1][]有5列,依此类推?
我不介意STL矢量解决方案,但我还不太了解矢量.
嗨,我想做这样的事情:
int op(string s1, string s2){
int x = s1.size();
int y = s2.size();
int matrix = new int[x][y]
/* do stuff with matrix */
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我收到以下错误:
SuperString.cpp(69) : error C2540: non-constant expression as array bound
SuperString.cpp(69) : error C2440: 'initializing' : cannot convert from 'int (*)[1]' to 'int'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
SuperString.cpp(71) : error C2109: subscript requires array or pointer type
Run Code Online (Sandbox Code Playgroud)
谢谢!
我们正在尝试使用2D矢量,因为我们需要一个动态增长的2D数组.
我们试过这个:在类声明中:
vector<vector<double> > table;
Run Code Online (Sandbox Code Playgroud)
但是似乎没有分配表格.当我们尝试访问成员时,我们会遇到段错误.
那么我们尝试了这个:
类声明:
vector<vector<double> >* table;
Run Code Online (Sandbox Code Playgroud)
构造函数:
table = new vector<vector<double> >;
Run Code Online (Sandbox Code Playgroud)
但是现在我们之前访问它的方式(使用[] [])不起作用.
我们尝试了一个虚拟类:
class myClass {
public:
myClass();
~myClass();
vector<vector<double> > t;
};
myClass::myClass()
{
t = vector<vector<double> > (10, vector<double>(10));
}
Run Code Online (Sandbox Code Playgroud)
但它不能正常免费,我们得到核心转储.此外,当我们尝试增长数组时,我们将展开构建每个新行.
例如:
t[50] = vector<double>(5);
t[50][10] = 10;
Run Code Online (Sandbox Code Playgroud)
如果我们不这样做,我们会得到一个段错误