私はそのようなコード持っている(ベクター中に残留:0 1 2 3 4)。 ここで.base()は何をしますか?C++ STL)は
13
A
答えて
22
base()
フォワード対応イテレータに逆反復子を変換します。しかし、その単純さにもかかわらず、この対応は、あるものと同じくらい些細なものではありません。
リバースイテレータポイント一つの要素で、それは以前のものを間接参照し、それ物理点および要素が論理点に要素が異なります。次の図では、i
は前方イテレータであり、そしてri
がi
から構成リバースイテレータである:論理素子2
を指す
i, *i
|
- 0 1 2 3 4 -
| |
*ri ri
したがってri
場合、それは物理的要素3
を指します。したがって、順方向イテレータに変換すると、結果のイテレータは、3
という要素を指します。これは、あなたの例では削除されます。
次の小さなプログラムは、上記の動作を示しています。ここ
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main(int argc, char *argv[])
{
std::vector<int> v { 0, 1, 2, 3, 4 };
auto i = find(begin(v), end(v), 2);
std::cout << *i << std::endl; // PRINTS 2
std::reverse_iterator<decltype(i)> ri(i);
std::cout << *ri << std::endl; // PRINTS 1
}
はlive exampleです。
8
base()
は、基になる基本イテレータを返します。
ベース反復子は要素の隣にある要素を指す
reverse_iterator
が現在指しています。つまり、std::reverse_iterator(it).base() == std::next(it)
です。
あなたはreverse_iterator
hereについての詳細を学ぶことができます。
関連する問題
- 1. C++ stl stringstreamダイレクトバッファアクセス
- 2. C++ STLベクトル
- 3. バイナリサーチC++ STL
- 4. C++ STLベクトルディープイレース
- 5. C++ STLリンクリスト
- 6. C++テンプレートSTLコンテナ
- 7. C++:STL multimap.equal_range()
- 8. C++ STLメソッドのオーバーロード
- 9. STLのC++ isgreaterテンプレート
- 10. STLコンテナのC++ IDE
- 11. C++ヒープアロケータ&STLのデフラグ
- 12. C++ STL削除エラー
- 13. C++ STLアルゴリズム等しい
- 14. C++ STLコンテナとポインタ有効
- 15. 標準ライブラリSTL in C++
- 16. クラスのC++ STLセット - コンパイラエラーエラーC2664
- 17. C++テンプレートプログラミング/ STL演繹パラメータ
- 18. C++ STL unordered_mapイテレータ問題
- 19. C++ stl正しいパラメータpriority_queue
- 20. stl C++:クラス内のクラス
- 21. C++ STL - なぜ使用
- 22. C++ STLバージョニングの問題+ Boost
- 23. C++ - Set on(STLから)
- 24. C++ STLベクトルイテレータは、互換性のない
- 25. C++ STL; STLコンテナを含むクラスを反復するか?
- 26. C++ STLのmapは::キーで消去するC++ STLのmap、に関しては非既存のキー
- 27. STL
- 28. C#とはC++のSTL塗りつぶしメソッドと同じ
- 29. STL
- 30. jemallocを使用したC++ STL
おそらく、これをお読みください:http://www.cplusplus.com/reference/iterator/reverse_iterator/base/ – JBL