【问题标题】:Is it possible to initialize new std::vector in one line?是否可以在一行中初始化新的 std::vector ?
【发布时间】:2021-11-17 12:34:42
【问题描述】:

我只是想知道是否可以同时 new 和初始化一个 std::vector,就像,在一行中做两件事:

std::vector<int>* vec = new std::vector<int>(){3, 4};

而不是,首先:

std::vector<int>* vec = new std::vector<int>();

然后:

vec->push_back(3);
vec->puch_back(4);

【问题讨论】:

  • 不仅如此,甚至没有必要使用new
  • newstd::vector 是可疑的顺便说一句。 std::vector&lt;int&gt; vec{3, 4};足够了吗?
  • 向量已经动态管理它的内存。几乎没有理由直接new 向量本身。
  • @HuXixi “但是我需要一个在堆上创建的向量,所以我需要一个新的” 你从哪里学来的?如前所述std::vector&lt;T&gt; 已经动态分配内存。
  • @HuXixi 如果你真的认为你需要一个动态分配的指针,不如使用std::unique_ptr&lt;std::vector&lt;T&gt;&gt;std::shared_ptr&lt;std::vector&lt;T&gt;&gt; 并明确决定所有权。

标签: c++ c++11 constructor initialization stdvector


【解决方案1】:

我只是想知道是否可以在以下位置新建和初始化 std::vector 同时,例如,将两件事合二为一?

是的,您可以通过std::initializer_list 构造函数10 of std::vector

constexpr vector( std::initializer_list<T> init,
                  const Allocator& alloc = Allocator() ); (since C++20)

你可以写

std::vector<int>* vec = new std::vector<int>{3, 4};

因为我需要一个在堆上创建的向量!

我们在 C++ 中使用的术语是automatic and dynamic storage。在大多数情况下,您不需要动态分配std::vector&lt;int&gt;,而是需要元素在那里。为此,您只需要一个整数向量。

std::vector<int> vec {3, 4};

但是,如果您要使用多维向量,那么我建议您使用 inters 向量的向量:

std::vector<std::vector<int>> vec{ {3, 4} };

当内部向量的长度相同时,保留单个std::vector 并操作索引以充当二维数组。

在这两种情况下,后台的std::vector 都会为您进行内存管理。

【讨论】:

  • 谢谢,因为我需要一个在堆上创建的向量。
  • @HuXixi 向量为你管理内存。向量内部在堆上分配。
  • @HuXxi C++ 中没有堆和栈的概念。为什么你还需要它?
  • @RoQuOTriX 如果我想将 std::vector* 作为参数放入 pthread_create 怎么办?那我应该新建一个 std::vector?
  • @HuXixi 你可以使用指针或引用来传递向量。取决于向量的生命周期(您开始和加入线程的位置以及创建向量的位置)它还取决于您是否必须“新建”它(最好使用智能指针)然后在新创建的线程中删除它。但是这个问题是非常具体的。您需要线程内存管理方面的具体帮助吗?您可以针对您的问题提出一个新问题(并可能在此处链接,我会对此感兴趣:D)
【解决方案2】:

这个std::vector&lt;int&gt;()调用了默认构造函数,但是还有其他的构造函数:https://en.cppreference.com/w/cpp/container/vector/vector

还有一个构造函数可以使用 std::initializer_list&lt;T&gt;std::vector&lt;int&gt;({3,4})

无论您是否使用new 分配向量,这都没有什么不同。但是,几乎没有充分的理由通过new 分配std::vector,因为向量已经将其元素存储在动态分配的内存中。

【讨论】:

  • 如果我想将 std::vector* 作为参数放入 pthread_create 怎么办?
  • 首先你应该使用std::thread,但是如果你出于某种原因被绑定到pthreads,那么......我不明白这个问题;)。您不需要动态创建对象来获取指向它的指针。 std::vector&lt;int&gt; vec; std::vector&lt;int&gt;* vec_pointer = &amp;vec;
  • yes, ;) 这是从上述问题扩展而来的,但是如果我将本地向量的指针放入 pthread_create 中,则会导致段错误,所以我认为我应该在堆上新建一个向量在这种情况下明确。
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 2015-05-22
  • 1970-01-01
  • 2017-04-17
  • 2013-07-13
  • 2012-06-09
  • 1970-01-01
  • 2012-08-07
相关资源
最近更新 更多