在C++向量中声明后分配元素

5
请参考下面的代码和注释:
vector<int> v1(10);
cin>>v1[0]; // allowed
cin>>v1[1]; // allowed

// now I want v1 to hold 20 elements so the following is possible:

cin>>v1[15]>>v[19]; // how to resize the v1 so index 10 to 19 is available.
4个回答

8

在添加新值之前,您只需要调整向量的大小:

v1.resize(20);

调整大小后,我可以使用cin输入而不需要push_back吗? - Shamim Hafiz - MSFT
@Gunner:vector<int> v1(10); 实际上与 vector<int> v1; v1.resize(20); 是相同的。话虽如此,你对 push_back 有什么意见(或者说,你对 reserve 后跟着 push_back 有什么意见)? - James McNellis
@James:没有任何反对意见,但情况是这样的,我想直接将输入放入向量中,而不是一个临时变量。最终结果都是一样的,但我想知道是否有其他选择。 - Shamim Hafiz - MSFT
2
@Gunner:是的 - 调整大小后,您可以通过 v1[0] 到 v1[19] 访问它,而无需使用 push_back。 - Aaron

4

您可以像这样使用resize

v1.resize(20);

3

如果你想从 cin 中读取尽可能多的值,可以使用 istream_iterator 迭代器范围,并将其传递给 vector 范围构造函数,像这样:

#include <iterator> // for istream_iterator
#include <vector>
#include <iostream> // for cin

// ...

std::vector<int> v1( (std::istream_iterator<int>( std::cin )), // extra ()
                     std::istream_iterator<int>() );

(多余的括号是为了防止{{link1:“C ++最令人困扰的解析”}})。另见{{link2:使用istream_iterators构造向量}}。


虽然这不完全是我想要的,但它本身就是一个有用的功能。在许多情况下,我们首先要做的是在声明后将输入读入向量中。 - Shamim Hafiz - MSFT

2

vector::resize()函数将会改变向量的大小并用默认构造对象填充它(在这种情况下是整数,所以没有关系)。

vector::reserve()函数将分配空间,但不会填充任何内容。

你可以使用例如push_back()来添加额外的项,直到它达到您想要的任意数量 - 它会根据需要自动调整大小。


很重要。因为它使用了x[<newMember>] = T() (在人们抱怨之前(概念上,确切的细节略有复杂))初始化新成员的方法,而INT是一个POD。POD值被值初始化,因此成员设置为0。 - Martin York
请注意,reserve 不会增加大小,只会增加容量。因此,在 OP 的情况下,reserve(20) 后将无法访问元素 15 和 19。你需要使用 resize 来实现。 - Steve Fallows
@Martin:我是说它不是一个复杂、耗时的构造函数,也不是你可以控制的构造函数。 - jwismar
@Steve - 是的 - 但我这样做是因为底层问题可能涉及容量,而使用默认构造对象填充向量几乎从来没有什么用处。我发现reserve()跟随某种插入方式几乎总是我想要做的事情。 - jwismar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接