簡體   English   中英

std :: vector構造與元素的構造

[英]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 )emplace構造元素的向量。

當你認為代碼的某些部分是冗長的並且會多次出現時,只需創建一個盡可能通用的輔助函數。

簡單版本:

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
XOR:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM