C++从标准输入初始化一个大小的数组
当我需要在C++中存储多个相同类型的值时,我可以使用一个向量或数组。到目前为止,我主要只使用向量,但我听说数组处理速度更快(读取和写入值)。如果这是真的,我想知道如何用标准输入读取的大小来创建一个数组。我目前使用的是这样的:C++从标准输入初始化一个大小的数组
int N;
cin >> N;
vector<int> myVector(N);
我曾尝试:
int N;
cin >> N;
array<int, N> myArray;
,但是这给了我一个错误,因为:
错误:的“N”的值不是一个常量表达式可用
我也曾尝试:
int N;
cin >> N;
int myArray[N];
这将编译,但是当我试着问这个ARRA的大小Y(myArray.size()
)遍历它与一个for循环然后我得到一个错误:
错误:会员“尺寸”在“myArray的”,请求其是非类型的“INT [N]”
所以我应该用数组替换向量来使我的代码更快,如果是的话我应该怎么做呢?
N
应该在编译时知道。因此,如果您想要使用array
进行I/O操作,则应指定允许读取的最大数量int
。另外,您应该自行跟踪读取整数的数量。
So should I replace vectors with arrays to make my code faster and if so the how should I do it?
不,因为operator>>
将是您的情况的瓶颈。并且当int
s的数字未知时,与vector
一起工作就好了。
数组不是C++中的对象,所以没有.size()函数。你应该让另一个变量保持它的大小。
int* array = new int[size];
就是这样。但是,你应该有充足的理由来做这件事,因为它更安全,更易于使用。使用数组
后,必须将其删除:
delete [] array;
,并记住你永远可以使用矢量:: data()函数得到一个向量数组
其他一切都很好......但是我对最后一点低估了,这是危险的错误。这甚至编译?它不应该,因为这不是一个有效的隐式演员。无论如何,'std :: vector'不会提供一个重载的'operator&'来访问它的缓冲区,也不应该这样做。 (A)我不知道如何和(B)你需要立即替换该代码,因为它不应该工作,并且可能在任何时候爆炸。 –
@underscore_d我认为他的意思是'vector :: data()'函数。这实际上是一个指向底层数据数组的指针。 http://en.cppreference.com/w/cpp/container/vector/data – DNK
正确,-1被删除。当然,这个底层数组是由'vector'管理的,所以我们不能将其替换为所有使用原始数组的情况,特别是如果它们可能试图“删除”它。我认为最好只使用'.data()'传递给需要原始指针的API,最好是只读的'const'。其他任何事情都是在寻求麻烦,并且有些挫败了使用vector的观点。尽管如此,在某些情况下可以方便地使用'.data()'并写入,但我认为它们最好局限于创建'vector'并维护其大小的人。 –
***我应该用数组替换向量,使我的代码更快***不,你需要一个动态数组,所以使用一个向量。 – drescherjm
'std :: array'的速度优势(及其基于堆栈的对象的大小限制)来自这样一个事实,即std :: array的大小在编译时是已知的,因此它可以避免分配和更重要的是间接的。可能有一个类似std :: array的数据结构的地方,它具有已知的大小上限,但动态大小高达此上限。但是,标准C++库中没有这样的数据结构。 –
'int myArray [N];'是一个VLA。这不是合法的C++,而是一个编译器扩展。无论如何,我怀疑它比矢量更快,它使你的代码只能在支持这种非标准扩展的编译器上工作。 – drescherjm