如何在从另一个容器创建 std::vector 时确保一次性内存分配?

问题描述 投票:0回答:1

当我需要从另一个容器(假设是另一个向量)的某些元素创建 std::vector 时,最安全的方法是确保新向量仅在内存中分配一次(从技术上讲,是两次,但让我们忽略起始齿大小) )是:

std::vector<int> v1 = { 1, 2, 3, 4, 5, 6 };
const size_t amount = 3;
std::vector<int> v2;
v2.reserve(amount);
v2.insert(v2.begin(), v1.begin(), v1.begin() + amount);

同时,这段代码比从向量中提取子向量的最佳方法中的非常简单的结构要长得多

std::vector<int> v1 = { 1, 2, 3, 4, 5, 6 };
const size_t amount = 3;
std::vector<int> v2(v1.begin(), v1.begin() + amount);

std::vector<int> v1 = { 1, 2, 3, 4, 5, 6 };
const size_t amount = 3;
std::vector<int> v2 = {v1.begin(), v1.begin() + amount};

问题是,后一种情况是否确保 v2 的内存仅分配一次,或者具体实现可以轻松使用诸如 Push_back 或 emplace_back 循环之类的东西(我夸张地说明了这一点)并导致许多容器内存重新分配它的创作是复制品吗?

是由标准保证的,还是至少我可以依赖现有的实现,它们不会多次重新分配内存?

我很担心,因为我使用巨大的容器,并希望确保这些更具可读性的代码不会对性能产生影响。

c++ stl
1个回答
0
投票

根据 https://en.cppreference.com/w/cpp/container/vector/vector#Complexity,列出的第五个构造函数(用于两个迭代器),对于非输入迭代器,不会发生重新分配。构造函数必须执行相当于

reserve(distance(first, last))
的操作才能符合标准。

因此您的

std::vector<int> v2(v1.begin(), v1.begin() + amount);
将只有一个分配。

© www.soinside.com 2019 - 2024. All rights reserved.