1. イテレータを使用してベクトルコンテナのステップを横断する
1. イテレータを使用してベクトルコンテナを走査する手順
イテレータを使用してベクトルコンテナを走査します。
まず、開始範囲の反復子、std::vector<int> 型コンテナーを取得します。その反復子の型は Vector<int>::iterator です。ベクター クラスの begin() 関数を呼び出します。最初の反復子へのポインターを取得できます。要素のコンテナ反復子内。
vector<int>::iterator it = vec.begin();
次に、イテレータが指す要素の内容を取得するには、* 演算子を使用します。これは、実際にはオーバーロードされた * 演算子関数を呼び出します。
*it
次に、反復子に対して自動インクリメント操作を実行します。自動インクリメント ++ 操作は実際に、反復子をインクリメントするために使用されるオーバーロードされた ++ 演算子関数を呼び出します。実行後、反復子は次の要素を指します。
it++
最後に、イテレータがコンテナの最後まで反復したかどうかを確認します。ベクトル クラスの end() 関数を呼び出して、コンテナ内の最後の要素を指すイテレータを取得します。現在のイテレータ値がイテレータ値と等しいかどうかを確認します。最後の要素のそうでない場合は、等しい場合は反復を継続し、等しい場合は反復を停止します。
it != vec.end();
2. コード例 - イテレータを使用してベクトル コンテナを走査する
コード例:
#include "iostream"
using namespace std;
#include "vector"
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3};
// 遍历打印 vector 容器的内容
for (int i = 0; i < vec.size(); i++) {
std::cout << vec[i] << ' ';
}
std::cout << std::endl;
// 通过迭代器遍历数组
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
std::cout << *it << ' ';
}
std::cout << std::endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
の結果:
1 2 3
1 2 3
続行するには任意のキーを押してください。。。
2. イテレータの一般的に使用される API の概要
1. ベクトル コンテナ クラスの begin 関数 - コンテナの最初の要素を指すイテレータを取得します。
ベクター コンテナ クラスの begin 関数を呼び出すと、コンテナの最初の要素を指すイテレータを取得できます。
iterator begin();
const_iterator begin() const;
上記の関数はすべて、コンテナ内の最初の要素を指すイテレータを返します。
最初のオーバーロードされたバージョン関数は非 const イテレータであり、コンテナ内の要素を変更するために使用できます。
2 番目のオーバーロードされたバージョン関数は定数反復子であり、コンテナー内の要素の変更には使用できません。
返されたイテレータは、* 演算子を使用して逆参照して、イテレータが指す要素の値を取得できます。
コード例:
#include "iostream"
using namespace std;
#include "vector"
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3};
// 获取首元素迭代器
vector<int>::iterator it = vec.begin();
// 打印首元素
cout << *it << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
の結果:
2. ベクトル コンテナ クラスの終了関数 - 終了イテレータを取得します。
ベクトル コンテナ クラスの end 関数を呼び出すことで、終了イテレータを取得できます。関数のプロトタイプは次のとおりです。
iterator end() const noexcept;
const_iterator end() const noexcept;
上記の関数は両方とも、コンテナ内の最後の要素の後の位置を指す反復子を返します。返された反復子は有効な要素を指しませんが、コンテナの最後を比較したり走査するために使用できます。
特記事項:ベクター コンテナを変更した後、end()
関数によって返されるイテレータは、コンテナが変更されても自動的には更新されません。ベクター コンテナ内の要素が変更された場合は、新しい end を取得するために end() 関数を再度呼び出す必要があります。イテレータ;
コード例:
#include "iostream"
using namespace std;
#include "vector"
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3};
// 获取末尾迭代器
vector<int>::iterator it = vec.end();
// 该迭代器指向 容器中 最后一个元素 之后一个位置
// 下面的代码会造成异常 , 不能获取对应的元素值
cout << *it << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
実行結果:終了イテレータは、コンテナ内の最後の要素の後の位置を指します。これは逆参照できず、例外が発生します。
3. イテレータ イテレータクラスの逆参照操作 - 演算子* オーバーロードされた演算子関数
* 演算子は、イテレータ オブジェクトの逆参照に使用できます。イテレータ クラスでは、* 演算子はオーバーロードされます。関数のプロトタイプは次のとおりです。
reference operator*() const;
Operator*() 関数は、反復子が指す要素への参照を返します。反復子を逆参照する場合は、反復子が指す要素の値が取得されます。
Operator* は、要素のコピーではなく、要素への参照を返します。取得した参照によって要素の値が変更されると、ベクトル コンテナ内の要素も変更されます。
特記事項: Operator* は非定数反復子にのみ適用されます。
コード例:
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3};
// 获取末尾迭代器
vector<int>::iterator it = vec.begin();
// 迭代器解引用
*it;
4. iterator イテレータのインクリメント操作 - Operator++ オーバーロードされた演算子関数
++ 演算子は、イテレータ オブジェクトをインクリメントするために使用できます。イテレータ クラスでは、++ 演算子はオーバーロードされます。関数のプロトタイプは次のとおりです。
// 前置 ++ 自增操作
iterator& operator++();
// 后置 ++ 自增操作
iterator operator++(int);
上記の 2 つの関数プロトタイプはどちらも、反復子が次の要素を指すように反復子オブジェクトをインクリメントできます。どちらの関数も非定数反復子にのみ使用できます。
-
接頭辞付きインクリメント演算子++:変更されたイテレータ自体への参照を返し、イテレータをインクリメントしてステートメント内で使用できるようにします。
-
後置インクリメント演算子++:元の反復子は変更せずに、次の要素を指す新しい反復子を返します。この演算子は、前置インクリメント演算子の優先順位との混同を避けるために int パラメータをオーバーロードします。
コード例:
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3};
// 获取末尾迭代器
vector<int>::iterator it = vec.begin();
// 前置递增操作符
it++;
// 后置递增操作符
it++;