簡體   English   中英

為什么insert_or_assign沒有迭代器重載?

[英]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.

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