[英]Why insert_or_assign doesn't have iterator overload?
在C ++ 17中,標准庫中的關聯容器將具有insert_or_assign
成員函數,該函數將執行其名稱所建議的操作。 不幸的是,似乎沒有用於批量插入/分配的基於迭代器的接口。 我什至嘗試編譯一個小的示例,並且由於編譯器錯誤,編譯器找不到合適的重載,並且沒有一個候選對象與基於迭代器的接口相當接近。
為什么C ++ 17沒有為批量操作提供基於迭代器的insert_or_assign
? 有什么技術原因嗎? 設計問題?
我沒有看到任何技術原因不添加基於迭代器的批量插入/添加。 似乎很可行。 無論如何,它都需要查找密鑰,因此我看不到任何“不要為不使用的東西付費”的違規行為。
實際上,沒有重載會使標准庫的一致性降低,並且有點違背自身。 普通insert
支持它,因此我希望insert_or_assign
也支持它。 我認為沒有過載不會使它“更容易正確使用,更難於錯誤使用”。
剩下的唯一線索是來自cppreference的通知:
insert_or_assign返回的信息比operator []還多,並且不需要映射類型的默認可構造性。
我不確定為什么這可能是一個限制,因為關聯容器可以訪問所有內部組件,而根本不需要處理operator[]
。
如果我沒有忘記任何內容,則二進制兼容性不適用於此處。 修改將在標頭中,並且無論如何都將需要重新編譯所有內容。
我也找不到任何相關的論文。 拼接地圖和集合似乎沒有提及。 該功能看起來像幻像。
Standard至少可以包含insert_assign_iterator
,以便可以編寫std::copy(input_first, input_last, insert_assign_iterator{map});
,但標准都不包含。
insert_or_emplace
旨在成為執行some_map[key] = value;
的更好形式some_map[key] = value;
。 后者要求mapped_type
是默認可構造的,而insert_or_emplace
則不是。
您所說的是相似的,但有所不同。 您有一定范圍的鍵值對,並且想要將所有這些值粘貼到映射中,無論它們是否具有等效鍵。 最初針對它們的建議證明,創建這些功能並不是要解決這些問題。
並不是說它們一定是一個壞主意。 根本不是功能要解決的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.