C++ <vector> begin / end 関数
beginとendvector で最も重要なイテレータ関数であり、次のために使用されます。コンテナの先頭と末尾のイテレータを取得します。。
beginとendコンテナクラスのメンバ関数です:
beginコンテナの最初の要素を指すイテレータを返します。endコンテナの最後の要素の次の位置を指すイテレータを返します。(番兵イテレータ)
これらの2つの関数は、C++ 標準ライブラリのアルゴリズムと範囲 for ループの基礎です。
単語の意味: begin「開始」を表し、end「終了」を表します。
基本構文とパラメータ
beginとendコンテナクラスのメンバ関数であり、呼び出しにパラメータは必要ありません。
構文形式
iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const;
パラメータの説明
- パラメータ: パラメータなし
- これらの関数はパラメータを一切受け取りません。
関数の説明
- 戻り値:
begin()最初の要素を指すイテレータを返します。end()最後の要素の次の位置を指すイテレータ(番兵)を返します。
- 効果: 返されたイテレータは、コンテナの走査やアルゴリズムとの併用に使用できます。
- 注意:
end()返されたイテレータは「仮想」の位置を指すため、逆参照できず、比較にのみ使用できます。
例
一連の例を通して、徹底的に習得しましょうbeginとendの使い方を。
例1:基本的な使い方 - コンテナの走査
例
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// イテレータを使って走査する
std::cout << "イテレータを使って走査: ";
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// イテレータを使って走査する
std::cout << "イテレータを使って走査: ";
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
実行結果の予想:
使用迭代器遍历: 10 20 30 40 50
コードの解説:
numbers.begin()最初の要素(10)を指すイテレータを返します。numbers.end()最後の要素の次の位置を指すイテレータを返します。- ループ条件
it != numbers.end()すべての要素を走査することを保証します。
例2:範囲 for ループ
C++11 で導入された範囲 for ループは、内部でbeginとend。
例
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
// 範囲 for ループ(内部で begin/end を使用)
std::cout << "範囲 for ループを使用: ";
for(const auto& name : names) {
std::cout << name << " ";
}
std::cout << std::endl;
return 0;
}
#include <vector>
#include <string>
int main() {
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
// 範囲 for ループ(内部で begin/end を使用)
std::cout << "範囲 for ループを使用: ";
for(const auto& name : names) {
std::cout << name << " ";
}
std::cout << std::endl;
return 0;
}
実行結果の予想:
使用范围 for 循环: Alice Bob Charlie
コードの解説:
- 範囲 for ループはイテレータを使用した簡潔な書き方です。
- コンパイラが自動的に呼び出します
begin()とend()。
例3:STL アルゴリズムの使用
標準ライブラリのアルゴリズムは、範囲を指定するためにイテレータが必要です。
例
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {5, 2, 8, 1, 9, 3};
// ソート
std::sort(numbers.begin(), numbers.end());
std::cout << "ソート後: ";
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
// 要素を検索
auto it = std::find(numbers.begin(), numbers.end(), 8);
if(it != numbers.end()) {
std::cout << "要素を見つけました: " << *it << std::endl;
}
return 0;
}
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {5, 2, 8, 1, 9, 3};
// ソート
std::sort(numbers.begin(), numbers.end());
std::cout << "ソート後: ";
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
// 要素を検索
auto it = std::find(numbers.begin(), numbers.end(), 8);
if(it != numbers.end()) {
std::cout << "要素を見つけました: " << *it << std::endl;
}
return 0;
}
実行結果の予想:
排序后: 1 2 3 5 8 9 找到元素: 8
コードの解説:
std::sort(begin, end)イテレータを使用してソート範囲を指定します。std::find(begin, end, value)イテレータを使用して検索範囲を指定します。
例4:逆イテレータ
使用するとrbeginとrendコンテナを逆方向に走査できます。
例
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 正方向に走査
std::cout << "正方向: ";
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 逆方向に走査(rbegin/rend を使用)
std::cout << "逆方向: ";
for(auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 正方向に走査
std::cout << "正方向: ";
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 逆方向に走査(rbegin/rend を使用)
std::cout << "逆方向: ";
for(auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
実行結果の予想:
正向: 1 2 3 4 5 反向: 5 4 3 2 1
コードの解説:
rbegin()最後の要素を指す逆イテレータを返します。rend()最初の要素の前を指す逆イテレータを返します。
例5:イテレータの算術演算
イテレータは算術演算をサポートしており、指定位置へすばやく移動できます。
例
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50, 60, 70};
// 3番目の要素を取得(インデックス 2)
auto it = numbers.begin() + 2;
std::cout << "begin() + 2 = " << *it << std::endl;
// 2つのイテレータ間の距離を計算
auto first = numbers.begin();
auto last = numbers.end();
auto distance = last - first;
std::cout << "コンテナのサイズ(距離): " << distance << std::endl;
// 中央の要素を取得
auto mid = numbers.begin() + (numbers.size() / 2);
std::cout << "中央の要素: " << *mid << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50, 60, 70};
// 3番目の要素を取得(インデックス 2)
auto it = numbers.begin() + 2;
std::cout << "begin() + 2 = " << *it << std::endl;
// 2つのイテレータ間の距離を計算
auto first = numbers.begin();
auto last = numbers.end();
auto distance = last - first;
std::cout << "コンテナのサイズ(距離): " << distance << std::endl;
// 中央の要素を取得
auto mid = numbers.begin() + (numbers.size() / 2);
std::cout << "中央の要素: " << *mid << std::endl;
return 0;
}
実行結果の予想:
begin() + 2 = 30 容器大小(距离): 7 中间元素: 40
コードの解説:
- イテレータは
+、-などの算術演算をサポートしています。 - を使用すると
end() - begin()コンテナのサイズを計算できます。
例6:イテレータとインデックスの変換
イテレータとインデックスは相互に変換できます。
例
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// インデックスをイテレータに変換
size_t index = 2;
auto it = numbers.begin() + index;
std::cout << "インデックス " << index << " に対応する要素: " << *it << std::endl;
// イテレータをインデックスに変換
auto iter = numbers.begin() + 3;
size_t idx = iter - numbers.begin();
std::cout << "イテレータに対応するインデックス: " << idx << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// インデックスをイテレータに変換
size_t index = 2;
auto it = numbers.begin() + index;
std::cout << "インデックス " << index << " に対応する要素: " << *it << std::endl;
// イテレータをインデックスに変換
auto iter = numbers.begin() + 3;
size_t idx = iter - numbers.begin();
std::cout << "イテレータに対応するインデックス: " << idx << std::endl;
return 0;
}
実行結果の予想:
索引 2 对应的元素: 30 迭代器对应的索引: 3
コードの解説:
begin() + indexインデックスをイテレータに変換します。iter - begin()イテレータをインデックスに変換します。
例7:イテレータを使用した要素の変更
イテレータが返すのは参照であり、要素の変更に使用できます。
例
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "変更前: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
// イテレータを使用してすべての要素を2倍にする
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
*it *= 2;
}
std::cout << "変更後: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "変更前: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
// イテレータを使用してすべての要素を2倍にする
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
*it *= 2;
}
std::cout << "変更後: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
実行結果の予想:
修改前: 1 2 3 4 5 修改后: 2 4 6 8 10
コードの解説:
- イテレータの逆参照(
*it)は要素の参照を返します。 - この参照を直接変更して、要素の値を変えることができます。
その他の拡張
C++ コンテナクラス <vector>