std::矢量构造与元素的就地构造
std::vector construction with in place construction of elements
是否可以构造一个具有初始大小的std::vector并就地构造其元素?我存储的类型不可复制,因此这不起作用,因为初始值被构造为临时值并复制到元素中:
#include <iostream>
#include <memory>
#include <vector>
struct A
{
A(int i = 0) : i_ (i) {};
int i_;
std::unique_ptr<int> p_; // not copyable
};
int main()
{
std::vector<A> v (10, 1); // error
}
这接近我想要实现的目标,也许还不错,但我想知道是否有一种更清洁的方法:
int main()
{
//std::vector<A> v (10, 1); // error
std::vector<A> v;
v.reserve (10);
for (int i = 0; i < 10; ++i) {
v.emplace_back (1);
}
}
我仅限于 c++11,但出于好奇,我也对 c++17 解决方案感兴趣。
您可以使用std::generate_n
:
auto generator = []() {
return A(1);
};
std::vector<A> v;
v.reserve(10);
std::generate_n(std::back_inserter(v), 10, generator);
您的循环解决方案似乎是最佳方法。
没有内置的方法可以使用N
(用于N>1
(放置构造元素创建矢量。
当您认为代码的某些部分冗长并且会出现很多次时,只需创建一个尽可能通用的辅助函数即可。
简单版本:
template<typename F>
auto generate_vector(size_t n, F &&f) -> std::vector<decltype(f())>
{
std::vector<decltype(f())> result;
result.reserve(n);
for (size_t i=0; i<n; ++i)
result.emplace_back(f());
return result;
}
// Possible use:
auto v = generate_vector(10, [] { return A(); });
https://wandbox.org/permlink/ANqIEMBfhIS5Dp60异或:
template<typename T, typename...Args>
auto generate_vector(size_t n, Args&&...args) -> std::vector<T>
{
std::vector<T> result;
result.reserve(n);
for (size_t i=0; i<n; ++i)
result.emplace_back(args...);
return result;
}
https://wandbox.org/permlink/4DHXgRSC9bE9qei9
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何从存储在std::映射中的std::集中删除元素
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- std::矢量保存 只推送最后一个元素
- std::map:当元素不可默认构造时创建/替换元素
- 如何读/写或遍历 std::array 中的特定元素范围?
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 为什么 std::p air 的大小与其元素的大小之和不同?
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 如何打印属于地图的一系列元素(std::p air<size_t,std::string>)(不是所有元素)
- 元素 std::vector <struct>的更有成效的段落
- 不能直接分配元素 std::array,它说没有运算符"="匹配
- 如何到达 2d std::vector 的第 N 个元素('std::vector< std::vector<T> >')?