我有一個std::map<CompositeKey, std::string>,CompositeKey我寫的課程在哪里。這CompositeKey具有三個int資料成員,所有建構式,所有復制賦值運算子和 a friend bool operator<,它比較三個資料成員的總和。
我了解如何使用emplaceand emplace_hint。
例如:
// emplace
std::map<CompositeKey, std::string> my_map;
int first_id = 10, second_id = 100, third_id = 1000;
std::string my_string = "foo";
auto [ insertedIt, success ] = my_map.emplace(std::piecewise_construct,
std::forward_as_tuple(first_id, second_id, third_id),
std::forward_as_tuple(my_string));
// emplace_hint
first_id = 5, second_id = 50, third_id = 500;
my_string = "bar";
std::tie(insertedIt, success) = my_map.emplace_hint(insertedIt
std::piecewise_construct,
std::forward_as_tuple(first_id, second_id, third_id),
std::forward_as_tuple(my_string));
我能夠使用的唯一方法try_emplace是在沒有提示的版本中:
first_id = 1, second_id = 10, third_id = 100;
my_string = "foobar";
std::tie(insertedIt, success) = my_map.try_emplace({first_id, second_id, third_id},
my_string);
我的問題是:
- 這是
try_emplace沒有提示的唯一方法嗎?如果不是,我怎么稱呼它? - 我怎么能用
try_emplace提示來呼叫版本?我做了一些嘗試,但總是失敗。 - 假設
try_emplace“移動”或“復制”地圖內的 CompositeKey 是否正確?我詢問try_emplace兩者的行為是因為我在另一個討論中讀到了類似的內容,并且因為我撰寫了一個詳細的副本并移動建構式來進行測驗。
對不起,我做了我的研究,但不明白cppreference 檔案中的這些要點
uj5u.com熱心網友回復:
我認為您可能誤解了 cppreference 檔案。在您的代碼中,您總是試圖添加一個不在地圖中的鍵。并且您將該鍵作為左值參考傳遞。您的兩種情況的唯一區別是您在第二次呼叫中使用了提示。try_emplace因此,根據 cppreference,您使用的兩個版本是 1 和 3。
template< class... Args > pair<iterator, bool> try_emplace( const Key& k, Args&&... args ); (1) (since C 17) template< class... Args > iterator try_emplace( const_iterator hint, const Key& k, Args&&... args ); (3) (since C 17)
注意:
- 兩個版本都將鍵作為左值參考 (
Key&)。 - 第一個版本回傳一個
pair<iterator, bool,但第二個版本只回傳一個iterator。
現在,下面的文字并沒有告訴你如何構建你的try_emplace論點;相反,它說明了try_emplace內部正在做什么。
1) If a key equivalent to k already exists in the container, does nothing. Otherwise, behaves like emplace except that the element is constructed as value_type(std::piecewise_construct, std::forward_as_tuple(k), std::forward_as_tuple(std::forward<Args>(args)...))
簡而言之,只需呼叫try_emplace傳遞一個CompositeKey物件和一個字串作為引數(以及可選的迭代器作為提示)。下面的代碼try_emplace使用左值和右值呼叫(第二次呼叫帶有提示),因此它將使用版本 1 和 4。
[演示]
std::map<CompositeKey, std::string> my_map;
std::cout << "Case 1:\n";
auto key1{CompositeKey{10, 100, 1000}};
auto value1{std::string{"foo"}};
auto [insertedIt, success] = my_map.try_emplace(key1, value1);
std::cout << "Case 2:\n";
insertedIt = my_map.try_emplace(insertedIt, {5, 50, 500}, "bar");
// Outputs:
//
// Case 1:
// custom ctor
// copy ctor
// Case 2:
// custom ctor
// move ctor
- 假設 try_emplace “移動”或“復制”地圖內的 CompositeKey 是否正確?
無論您通過什么,都將轉發給try_emplace實施。在上面的示例中,兩個CompositeKey引數首先是“自定義構造的”;然后,它們被傳遞給try_emplace,其中左值是復制構造的,而右值是移動構造的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/410046.html
標籤:
下一篇:如何將鏈表添加到特里葉?
