c++ - std::vector 构造,具有元素的就地构造

标签 c++ c++11 stl

是否可以构造一个具有初始大小的 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);

关于c++ - std::vector 构造,具有元素的就地构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56429047/

相关文章:

c++ - 自定义类到枚举类的隐式转换

c++ - switch 语句条件下同时具有模板和非模板转换运算符的类

c++ - 继承构造函数仅部分起作用

c++ - 队列不添加对象 - C++ 11

c++ - 关联容器作为函数模板参数

c++ - 需要一些关于 C++ 中简单无损压缩算法的想法

c++ - 如何从文件中读取包含子列表的列表?

c++ - 如何让 VS2013 停止生成对 __dtol3、__dtoui3 和其他整数类型转换函数的调用?

c++ - 使用 stat 检测文件是否存在(慢?)

c++ - 如何将通用 packaged_tasks 存储在容器中?