【问题标题】:Allocating elements in C++ vector after declaration声明后在 C++ 向量中分配元素
【发布时间】:2011-08-20 20:04:33
【问题描述】:

请参考下面的代码和cmets:

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.

【问题讨论】:

    标签: c++ vector resize dynamic


    【解决方案1】:

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

    v1.resize(20);
    

    【讨论】:

    • 调整大小后,我可以使用 cin 输入而不需要 push_back?
    • @Gunner:vector&lt;int&gt; v1(10); 实际上与vector&lt;int&gt; v1; v1.resize(20); 相同。也就是说,您对push_back 有什么看法(或者,您对reserve 后跟push_back 有什么看法?)
    • @James:没有什么反对的,但情况就是这样,我想将输入直接输入向量而不是临时变量。最后,两者都是一样的,但想知道是否有替代方案。
    • @Gunner:是的 - 调整大小后,您可以在没有 push_back 的情况下访问 v1[0] 到 v1[19]。
    【解决方案2】:

    你可以像这样使用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>() );
      

      (需要额外的括号以防止"C++ most vexing parse")。参照。还有Constructing a vector with istream_iterators

      【讨论】:

      • 虽然这不是我想要的,但它是一个有用的特性。在许多情况下,我们要做的第一件事就是在声明向量后将其输入。
      【解决方案4】:

      vector::resize() 将调整它的大小并用默认构造的对象(在这种情况下是 int,所以没关系)填充它。

      vector::reserve() 将分配空间,而不是填充它。

      您可以使用例如 push_back() 添加其他项目,直到它包含您想要的任意数量的项目 - 它会根据需要自行调整大小。

      【讨论】:

      • 这很重要。因为它使用x[&lt;newMember&gt;] = T()(在人们抱怨之前(从概念上讲,确切的细节稍微复杂一些))方法来初始化新成员并且INT 是一个POD。 POD 值是值初始化的,因此成员设置为 0。
      • 注意reserve不会增加大小,只会增加容量。因此,在 OP 的情况下,不可能在 reserve(20) 之后访问元素 15 和 19。为此,您需要resize
      • @Martin:授予 - 但我的意思是它不是一个涉及的、耗时的构造函数 - 或者你可以控制的构造函数。
      • @Steve - 对 - 但我补充说,因为潜在的问题可能与容量有关,并且用默认构造的对象填充向量几乎没有用处。我发现 Reserve() 后跟某种类型的插入几乎总是我想要做的。
      猜你喜欢
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多