[英]Should I prefer iterators over const_iterators?
我完全同意你的看法。 我認為答案很簡單:使用const_iterators,其中const值是正確的使用方法,反之亦然。 在我看來,反對const_iterators的人一般都要反對const ...
這是一個略微不同的方式來看待它。 當你將它作為指針傳遞給特定集合並且你也傳遞集合時, Const_iterator
幾乎沒有意義。 Meyer先生特別指出const_iterator
不能與集合實例的大多數成員函數一起使用。 在這種情況下,您將需要一個普通的iterator
。 但是,如果您沒有集合的句柄,則兩者之間的唯一區別是您可以修改iterator
指向的內容,並且您無法修改const_iterator
引用的對象。
所以...當你將集合和位置傳遞給算法時,你想要使用iterator
。 基本上,簽名如:
void some_operation(std::vector<int>& vec, std::vector::const_iterator pos);
沒有多大意義。 隱式語句是some_operation
可以自由修改底層集合,但不允許修改pos
引用。 這沒有多大意義。 如果你真的想要這個,那么pos
應該是一個偏移而不是迭代器。
另一方面,STL中的大多數算法都基於一對迭代器指定的范圍。 集合本身永遠不會被傳遞,因此iterator
和const_iterator
之間的區別在於是否可以通過迭代器修改集合中的值。 沒有參考集合,分離是非常清楚的。
希望這能使事情像泥一樣清晰;)
我通常更喜歡constness,但最近遇到了const_iterators的難題,這讓我的“總是使用const是可能的”哲學感到困惑:
MyList::const_iterator find( const MyList & list, int identifier )
{
// do some stuff to find identifier
return retConstItor;
}
由於傳入一個const列表引用需要我只使用const迭代器,現在如果我使用find,我不能對結果做任何事情但看看它,即使我想做的只是表達發現不會改變列表是傳入
那么,我想也許,如果斯科特梅耶斯的建議與這樣的問題有關,那么就不可能逃避常規。 根據我的理解,由於一些內部細節,你不能 (可靠地)使用簡單的強制轉換來使用un const const_iterator。 這也(也許是結合)是問題。
這可能是相關的: 如何刪除const_iterator的constness?
我不認為Meyer的這一特別聲明需要特別關注。 如果需要非修改操作,最好使用const_iterator
。 否則,使用普通的iterator
。 但是,請注意一件重要的事情:永遠不要混合迭代器,即const
與non-const
迭代器。 只要你知道后者,你應該沒事。
我認為需要考慮到Meyers聲明引用c ++ 98。 今天很難說,但如果我沒記錯的話
例如
std::vector<int> container;
本來需要的
static_cast<std::vector<int>::const_iterator>(container.begin())
獲得一個const_iterator,這會大大誇大一個簡單的.find,即使你之后得到了你的結果
std::vector<int>::const_iterator i = std::find(static_cast<std::vector<int>::const_iterator>(container.begin()), static_cast<std::vector<int>::const_iterator>(container.end()),42);
沒有辦法使用你的std :: vector :: const_iterator插入向量或任何其他預期位置迭代器的成員函數。 並且無法從const迭代器獲取迭代器。 沒有任何方法可以存在(存在嗎?)。
由於常量迭代並不意味着容器不能改變,而只是說指向的元素不能被改變(常量迭代器是指針常量的等價物),這是真正的廢話一大堆來應對這樣的情況下。
使用cbegin等很容易獲得const迭代器,即使對於非const容器也是如此,所有采用位置的(?)成員函數都有const迭代器作為參數,因此不需要任何轉換。
std::vector<int> container;
auto i = std::find(container.cbegin(), container.cend(), 42);
container.insert(i, 43);
那曾經是什么
比const_iterators更喜歡迭代器
今天真的應該是
首選const_iterator而不是迭代器
因為第一個只是歷史實施缺陷的人工制品。
通過我對該鏈接的閱讀,Meyers似乎從根本上說,interator比const_interator更好,因為你無法通過const_iterator進行更改。
但如果這就是他所說的,那么邁耶斯其實是錯的。 這正是為什么const_iterator比迭代器更好的原因,那就是你想要表達的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.