標準庫容器允許我們使用迭代器first
和last
表示的erase
範圍。在標準或設計決策中是否擦除了最終迭代器?
std::vector<foo> bar;
// first it last it
bar.erase(bar.begin(), bar.end());
的標準指出,first
迭代器必須是有效的和提領,而last
只需要有效。但是,如果first == last
,則first
不需要可解引用,因爲erase
是無操作的。這意味着以下是合法的:
bar.erase(bar.end(), bar.end());
但是如果我只是想刪除一個元素,而不是一個範圍的迭代器必須是有效的和提領做出如下未定義行爲:
bar.erase(bar.end());
爲什麼這不是一個沒有操作?這是標準委員會的疏忽,將在未來的語言版本中加以處理,還是我沒有看到這一點的故意設計決定?
至於我可以看到它在執行類似下面的時候沒有提供好處,但同時帶來額外的麻煩:
bar.erase(std::find(bar.begin(), bar.end(), thing));
它將不得不比較迭代器,所以每個沒有傳入結束迭代器的人現在都會執行額外的無用檢查。無論如何,需要比較兩者的範圍以知道何時停止擦除。 – chris
@chris:是的,它應該是_answer_。 –
@LightnessRacesinOrbit,這實在是一種猜測。這是一個小檢查。 – chris