【问题标题】:Vector C++ resize矢量 C++ 调整大小
【发布时间】:2018-01-08 19:34:07
【问题描述】:

我正在查看 Stack Overflow 上的一个答案,以便为 2d 矢量创建一个类。解决方案涉及在创建外部向量的同时初始化内部向量。

class A{
public:
   A(int dim1,int dim2):v(dim1,std::vector<int>(dim2)){}
private:   
   std::vector< std::vector<int> > v;
};

class A{
public:
   A(int dim1,int dim2){v.resize(dim1,std::vector<int>(dim2));}
private:   
   std::vector< std::vector<int> > v;
};

我知道向量可以这样初始化

size=4; value =10; std::vector<int> A (size,value);

但是,对于如何在缺少变量对象的情况下像 std::vector (size) 那样初始化向量,我没有直观的感觉,就像在初始代码 sn-p 中设置 dim2 时发生的那样。我错过了什么吗?

【问题讨论】:

标签: c++ c++11


【解决方案1】:

从概念上讲,v(dim1, X)v 设置为dim1 的大小,并将所有值初始化为X。由于vstd::vector&lt; std::vector&lt;int&gt; &gt; 类型,所以X 必须是std::vector&lt;int&gt; 类型。

std::vector&lt;int&gt;(dim2) 就是这样做的,根据 cmets here 和 @ 中提供的 SO 问题和文档,创建大小为 dim2 的内联 std::vector&lt;int&gt;,并将所有值初始化为 0 987654322@。 (这里使用构造函数#3,而不是#2。)

因此,结果是dim2 std::vector&lt; std::vector&lt;int&gt; &gt;dim1,其中所有int 变量都初始化为0

【讨论】:

  • 所以当你调用 std::vector (size) 时,你调用的是 std::vector 类的构造函数,将 size 作为参数传递给构造函数,然后是这个向量构造函数返回的对象作为第二个参数传递?
  • @KrishnaToshniwal 是的,没错。构造函数#2(外层)复制const T&amp; value 以放入其元素中。然后,在您的情况下,当整行完成时,您传入的内容将被释放,就像您只是简单地调用构造函数时一样......也就是说,没有在对象上调用它(我认为无论如何这被认为是不好的做法; 做一个“(重新)初始化”函数或其他东西,并从构造函数中调用它)。
【解决方案2】:

当您使用大小但没有值参数初始化std::vector 时,对象的所有实例都是值初始化的。对于类类型,这意味着调用默认构造函数,对于原始类型和聚合,这意味着所有内容都将设置为零。

除非您使用特殊的分配器,或者您使用的类类型有一个用户编写的构造函数无法初始化某些成员(这真的很糟糕),否则在使用 @ 时不可能有任何未初始化的东西987654324@.

这是文档:http://en.cppreference.com/w/cpp/container/vector/vector。它表明构造函数仅采用大小进行“默认插入”。正如本页:http://en.cppreference.com/w/cpp/concept/DefaultInsertable 所讨论的,使用默认分配器(和大多数分配器)的“默认插入”调用放置 new,它会执行值初始化。

在这种特定情况下,内向量是整数向量,外向量是整数向量。所以这意味着:

  1. 外部向量将由相同向量的dim1 副本组成(在值上,不是同一意义上;它们是不同的向量,但填充相同)。
  2. 内部向量将由 dim2 整数组成,所有值都为 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2018-04-07
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多