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的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
如果你有一个已调整大小的STL向量,是否可以安全地获取元素0的地址并假设其余的向量将跟随内存?
例如
vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
Run Code Online (Sandbox Code Playgroud) 我已经设置了一个测试程序来比较数组访问性能和std :: vector的性能.我发现了几个类似的问题,但似乎都没有解决我的具体问题.一段时间以来,为什么数组访问速度似乎比矢量访问快6倍,当我在过去读过它们应该是等价的时候,我一直在挠头.事实证明,这似乎是英特尔编译器(v12)和优化(发生在-O1以上的任何事情)的函数,因为我在使用gcc v4.1.2时看到std :: vector的性能更好,而数组只有 gcc v4.4.4的2倍优势.我正在使用Xeon X5355内核的RHEL 5.8机器上运行测试.顺便说一句,我发现迭代器比元素访问更快.
我正在使用以下命令进行编译:
icpc -fast test.cc
g++44 -O3 test.cc
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释速度的显着提高吗?
#include <vector>
#include <iostream>
using namespace std;
int main() {
int sz = 100;
clock_t start,stop;
int ncycle=1000;
float temp = 1.1;
// Set up and initialize vector
vector< vector< vector<float> > > A(sz, vector< vector<float> >(sz, vector<float>(sz, 1.0)));
// Set up and initialize array
float*** a = new float**[sz];
for( int i=0; i<sz; ++i) {
a[i] = new float*[sz];
for( …Run Code Online (Sandbox Code Playgroud) 我需要从用户获得输入N并生成N*N矩阵.我该如何申报矩阵?一般来说,数组和矩阵的大小应该在声明中固定,对吧?怎么样vector<vector<int>>?我从来没有使用过这个,所以我需要老兵的建议.
我刚刚开始研究速度真正重要的科学项目(HPC).我目前正在设计数据结构.该项目的核心是双值的3D网格,以求解偏微分方程.
由于这里的速度可能比代码的简单性更大,我想知道STL与通常的C风格数组相比如何执行.在我的例子中,因为它是一个3D网格,我想到了a)带有线性索引的一维向量b)3个向量的向量或c)一维c样式数组或d)三维c样式阵列.
我查找了较旧的问题,但我只发现了构建/破坏的问题(这里不重要,因为数据结构只在程序启动时创建一次 - 快速索引和计算很重要)或不同STL容器的比较.
感谢帮助
我是c ++的新手,我想写一个程序来生成一个整数数组.我一直在收到错误
test[i][j]=i;
invalid types 'int[int]' for array
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这里有什么问题?提前致谢.
int main()
{
int rows;
int cols;
cin>>rows>>cols;
int test[rows][cols];
get_test(rows,cols,&test[0][0]);
cout<<test[1][1]<<endl;
return 0;
}
int get_test(int rows,int cols,int *test)
{
int h=rows;
int w=cols;
int i=0,j=0;
for(i=0;i<h;i++)
{
for (j=0;j<w;j++)
{
test[i][j]=i;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)