是否可以在一行中初始化新的 std::vector ?

Posted

技术标签:

【中文标题】是否可以在一行中初始化新的 std::vector ?【英文标题】:Is it possible to initialize new std::vector in one line? 【发布时间】: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; vec3, 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; 并明确决定所有权。 【参考方案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 中,则会导致段错误,所以我认为我应该在堆上新建一个向量在这种情况下明确。

以上是关于是否可以在一行中初始化新的 std::vector ?的主要内容,如果未能解决你的问题,请参考以下文章

在定义的位置初始化向量向量 - C++

新分配的 std::vector<int> 元素是不是初始化为 0?

是否可以用整数数组初始化双精度矢量?

在对象初始化之前访问 C++ std::vector 对象成员

如何初始化std :: vector的静态constexpr成员 在c ++ 11中?

是否有直接获取 std::vector 元素大小的函数?