2017-12-27 65 views
1

当我需要在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]”

所以我应该用数组替换向量来使我的代码更快,如果是的话我应该怎么做呢?

+1

***我应该用数组替换向量,使我的代码更快***不,你需要一个动态数组,所以使用一个向量。 – drescherjm

+2

'std :: array'的速度优势(及其基于堆栈的对象的大小限制)来自这样一个事实,即std :: array的大小在编译时是已知的,因此它可以避免分配和更重要的是间接的。可能有一个类似std :: array的数据结构的地方,它具有已知的大小上限,但动态大小高达此上限。但是,标准C++库中没有这样的数据结构。 –

+1

'int myArray [N];'是一个VLA。这不是合法的C++,而是一个编译器扩展。无论如何,我怀疑它比矢量更快,它使你的代码只能在支持这种非标准扩展的编译器上工作。 – drescherjm

回答

1

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一起工作就好了。

0

数组不是C++中的对象,所以没有.size()函数。你应该让另一个变量保持它的大小。

int* array = new int[size]; 

就是这样。但是,你应该有充足的理由来做这件事,因为它更安全,更易于使用。使用数组

后,必须将其删除:

delete [] array; 

,并记住你永远可以使用矢量:: data()函数得到一个向量数组

+3

其他一切都很好......但是我对最后一点低估了,这是危险的错误。这甚至编译?它不应该,因为这不是一个有效的隐式演员。无论如何,'std :: vector'不会提供一个重载的'operator&'来访问它的缓冲区,也不应该这样做。 (A)我不知道如何和(B)你需要立即替换该代码,因为它不应该工作,并且可能在任何时候爆炸。 –

+0

@underscore_d我认为他的意思是'vector :: data()'函数。这实际上是一个指向底层数据数组的指针。 http://en.cppreference.com/w/cpp/container/vector/data – DNK

+1

正确,-1被删除。当然,这个底层数组是由'vector'管理的,所以我们不能将其替换为所有使用原始数组的情况,特别是如果它们可能试图“删除”它。我认为最好只使用'.data()'传递给需要原始指针的API,最好是只读的'const'。其他任何事情都是在寻求麻烦,并且有些挫败了使用vector的观点。尽管如此,在某些情况下可以方便地使用'.data()'并写入,但我认为它们最好局限于创建'vector'并维护其大小的人。 –