簡體   English   中英

我應該比const_iterators更喜歡迭代器嗎?

[英]Should I prefer iterators over const_iterators?

最近有人提出 Scott Meyers的文章說:

  • 首選iterators不是const_iteratorspdf鏈接 )。

其他人評論說這篇文章可能已經過時了。 我想知道你的意見是什么?

這是我的:本文的要點之一是你不能刪除或插入const_iterator ,但我認為將它作為反對const_iterators的參數很有趣。 我認為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中的大多數算法都基於一對迭代器指定的范圍。 集合本身永遠不會被傳遞,因此iteratorconst_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 但是,請注意一件重要的事情:永遠不要混合迭代器,即constnon-const迭代器。 只要你知道后者,你應該沒事。

C ++ 98

我認為需要考慮到Meyers聲明引用c ++ 98。 今天很難說,但如果我沒記錯的話

  • 根本不容易為非const容器獲取const_iterator
  • 如果你有一個const_iterator你可能幾乎沒有使用它,因為容器成員函數的大多數(所有?)位置參數都應該是迭代器而不是const_iterators

例如

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.

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