[英]How to create + fill a container in-place?
我正在嘗試創建一個無法復制或移動的類數組。 所以我需要就地創建對象,我無法弄清楚如何做到這一點:
#include <vector>
struct Foo {
Foo(int) { }
Foo(const Foo &) = delete;
Foo & operator =(const Foo &) = delete;
Foo(Foo &&) = delete;
Foo & operator =(Foo &&) = delete;
};
struct Bla {
Bla(const std::vector<int> & args) {
for (auto i : args) {
foo.emplace_back(i);
}
}
std::vector<Foo> foo;
};
編譯器抱怨刪除的移動構造函數,因為它不能保證所有對象都就地構造並且從不移動。 我沒有必要使用std::vector
作為容器,所以請隨意提出其他建議。
你可以使用std::vector
s迭代器對構造函數來構造像這樣的對象
Bla(const std::vector<int> & args)
: foo(args.begin(), args.end())
{}
如果您需要在構造中包含其他參數,則可以切換到任何基於節點的容器,如std::list
struct Bla {
Bla(const std::vector<int> & args) {
for (auto i : args) {
foo.emplace_back(i, some_other_argument);
}
}
std::list<Foo> foo;
};
一種方法是使用范圍構造函數。 傳遞隨機訪問迭代器時,它不會重新分配向量:
Bla(const std::vector<int> & args)
: foo(args.begin(), args.end())
{}
對於最通用的情況,是不是有一些方法可以從向量args和lambda創建初始化列表?
創建無法復制或移動的Foo
STL容器的另一種方法是包含可移動的std::unique_ptr<Foo>
。 例如,作為更通用的情況,如果Foo
的ctor的第一個和第二個參數分別是int
和double
,那么下面的Bla
適合你:
#include <tuple>
#include <vector>
#include <memory>
struct Bla
{
Bla(const std::vector<std::tuple<int, double>>& args)
{
foo.reserve(args.size());
for (const auto& i : args) {
foo.push_back(
std::make_unique<Foo>(std::get<0>(i), std::get<1>(i)));
}
}
std::vector<std::unique_ptr<Foo>> foo;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.