C++ <vector> begin / end 関数

C++ 容器类 <vector>C++ コンテナクラス <vector>


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;
}

実行結果の予想:

使用迭代器遍历: 10 20 30 40 50

コードの解説:

  1. numbers.begin()最初の要素(10)を指すイテレータを返します。
  2. numbers.end()最後の要素の次の位置を指すイテレータを返します。
  3. ループ条件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;
}

実行結果の予想:

使用范围 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;
}

実行結果の予想:

排序后: 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;
}

実行結果の予想:

正向: 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;
}

実行結果の予想:

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;
}

実行結果の予想:

索引 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;
}

実行結果の予想:

修改前: 1 2 3 4 5
修改后: 2 4 6 8 10

コードの解説:

  • イテレータの逆参照(*it)は要素の参照を返します。
  • この参照を直接変更して、要素の値を変えることができます。

C++ 容器类 <vector>C++ コンテナクラス <vector>

その他の拡張