std::矢量构造与元素的就地构造

std::vector construction with in place construction of elements

本文关键字:元素 std      更新时间:2023-10-16

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