我的問題是:
只包含 STL 容器的類可以使用零規則,從而避免手動撰寫析構器/復制等。
我想知道是否有一個STL工具(具有上述屬性)是為最簡單的情況設計的:一個元素(在堆上)?
解釋一下我們什么時候需要這個:
好吧,這個問題是比較小眾的/假設的:我們有一個物件Foo,有很多成員(n成員)。Foo經常被移動拷貝,以至于值得將其資料存盤為一個單一的堆物件(所以它可以不做n淺層拷貝,而只做1)。它有時也會被深層復制。 我們可以通過以下方式來解決這個問題:
我們可以通過以下方式來解決這個問題:
我們可以通過以下方式來解決這個問題
我們可以通過使用帶有一個元素的vector來解決這個問題:
class Foo
{
struct Data ?
{
char性別。
int age;
std::string name;
//大量的資料。
};
std::vector<Data> data。
public:
Foo () : data(1){}。
void Input (char c。int x, const std: :string & str)
{
auto & d = data[0] 。
d.gender = c;
d.年齡 = x;
d.name = str;
}
void Print () const
{
auto & d = data[0] 。
std::cout
<< d.gender << std::endl
<< d.年齡 << std::endl
<< d.name << std::endl;
}
};
為了避免建構式和所有那些[0],我們可以將向量包裝成自己的類,但這感覺像是一個黑客 - vector對此來說是過度殺戮,并且可能會持有額外的記憶體(size和capacity如果編譯器不進行優化)。
注意,
unique_ptr和shared_ptr對此有不同的復制組態檔,所以在這里沒有幫助(示例)。另外,這個問題與pimpl相似,但不完全相同,因為這里我們有一個已經定義好的型別(對于pimpl,我們甚至不能使用上面的vector技術)。 example。
uj5u.com熱心網友回復:
你可能正在尋找所謂的深度/克隆/拷貝/值指標(基本上是一個具有深度拷貝能力的唯一指標)。甚至有一個提案,不知道其實際狀況。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3339.pdf。
AFAIK,到目前為止,它還沒有被接受。也許,某個外部庫提供了它(Boost?
相關的問題。是否有一個內置了深度拷貝功能的作用域 ptr?在其接受的答案中,有一個指向某個庫的鏈接,它應該提供所需的功能。它似乎沒有被維護,但也許它仍然可用。
你可以通過谷歌尋找更多的解決方案。例如,你可以復制-粘貼(可能還可以審查)這個實作。https://vorbrodt.blog/2021/04/05/stddeep_ptr/。
我相信你也可以在Code Reivew網站上找到一些解決方案,例如。DeepPtr: a deep-copying unique_ptr wrapper in C 。我認為采用std::unique_ptr并直接用深拷貝功能來包裝它是一個好主意。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332988.html
標籤:
