2012-12-27 37 views
7

如何以規範的方式定義C++ 11中的forward-output-iterators?定義正向輸出迭代器的規範方法

根據標準,forward_iterator只是一個input_iterator。所以相應的forward_iterator_tag只延伸input_iterator_tag。如果我們使用std::iterator來定義我們的迭代器,我們使用什麼標籤作爲前向輸出迭代器?

定義一個可以擴展forward_iterator_tagoutput_iterator_tag的私有標籤是否正規?還是有更好的解決方案?

+0

繼承他們兩個都會做 –

+0

作爲一個側面的問題:有誰知道這些可變的迭代器標籤是否被認爲是標準庫?如果是這樣,爲什麼他們不包括在內? –

回答

6

規範的事情是隻從std::iterator<std::forward_iterator_tag, T>繼承。迭代器只有一個類別。

該標準對於也是前向迭代器的輸出迭代器沒有算法(或其他用途)。標準中輸出迭代器的所有用途只需要單遍。

相反,該標準的想法是可變的與不可變的迭代器的類別forward/bidi/randomaccess。所有需要通過迭代器寫入的算法,需要比單遍更好的算法,也可以通過它們寫入的相同迭代器讀取。這是std::remove,std::sort和其他變異算法。

可變和不可變迭代器之間的差異不會被迭代器標記檢測到,而是由賦值表達式是否格式良好決定的。因此,舉例來說,如果您將迭代器傳遞給std::sort,這是不可變的,那麼該算法無論如何都不會編譯,所以通常不需要使用output_iterator_tag來標記輸入迭代器。所有需要OutputIterator的算法都可以使用可變的ForwardIterator,同樣也不需要使用output_iterator_tag來標記它。

如果你有不同於標準算法的需求,那麼我不能立即想到你的提議對你的迭代器不起作用的原因。但它不會檢測可變標準迭代器。例如std::deque<int>::iteratorint*的迭代器類別爲random_access_iterator_tag,而不是您的私有標記,並且與output_iterator_tag沒有任何關係。所以你可能會更好地定義你自己的特質類,而不是希望適應現有的iterator_traits::iterator_category來提供你想要的信息。

+0

謝謝!這清理了很多東西。最後這意味着不可變的迭代器返回指向元素的const引用/副本,以防止通過返回的引用進行賦值,對吧? – MFH

+1

@MFH:沒錯。對容器的不可變迭代器返回'const T&'(我沒有檢查它是否實際需要,或者它們是否被允許返回代理)。其他不可變的迭代器可以返回任何可轉換爲「T」的東西。 –