是否可以在一行中初始化新的 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
。
new
std::vector
是可疑的顺便说一句。 std::vector<int> vec3, 4;
足够了吗?
向量已经动态管理它的内存。几乎没有理由直接new
向量本身。
@HuXixi “但是我需要一个在堆上创建的向量,所以我需要一个新的” 你从哪里学来的?如前所述std::vector<T>
已经动态分配内存。
@HuXixi 如果你真的认为你需要一个动态分配的指针,不如使用std::unique_ptr<std::vector<T>>
或std::shared_ptr<std::vector<T>>
并明确决定所有权。
【参考方案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<int>
,而是需要元素在那里。为此,您只需要一个整数向量。
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<int>()
调用了默认构造函数,但是还有其他的构造函数:https://en.cppreference.com/w/cpp/container/vector/vector。
还有一个构造函数可以使用 std::initializer_list<T>
:std::vector<int>(3,4)
。
无论您是否使用new
分配向量,这都没有什么不同。但是,几乎没有充分的理由通过new
分配std::vector
,因为向量已经将其元素存储在动态分配的内存中。
【讨论】:
如果我想将 std::vector* 作为参数放入 pthread_create 怎么办? 首先你应该使用std::thread
,但是如果你出于某种原因被绑定到pthreads,那么......我不明白这个问题;)。您不需要动态创建对象来获取指向它的指针。 std::vector<int> vec; std::vector<int>* vec_pointer = &vec;
yes, ;) 这是从上述问题扩展而来的,但是如果我将本地向量的指针放入 pthread_create 中,则会导致段错误,所以我认为我应该在堆上新建一个向量在这种情况下明确。以上是关于是否可以在一行中初始化新的 std::vector ?的主要内容,如果未能解决你的问题,请参考以下文章
新分配的 std::vector<int> 元素是不是初始化为 0?
在对象初始化之前访问 C++ std::vector 对象成员