[C++] std::listを範囲for文でループする方法

C++11以降、std::listを範囲for文でループすることが可能です。

範囲for文は、コンテナの要素を簡潔に反復処理するための構文を提供します。

具体的には、std::listの各要素を直接操作するために、for(auto& element : list)のように記述します。

この方法は、イテレータを明示的に使用する必要がないため、コードの可読性を向上させます。

また、要素を変更する場合は、auto&を使用して参照を取得することが推奨されます。

この記事でわかること
  • std::listの初期化方法
  • 範囲for文を使った基本的なループの方法
  • const修飾子を用いた要素の参照
  • autoキーワードを活用した型推論
  • std::listの要素を変更・削除・条件付きで処理する方法

目次から探す

std::listを範囲for文でループする方法

std::listの初期化

std::listはC++の標準ライブラリで提供される双方向リストです。

まずは、std::listの初期化方法を見てみましょう。

#include <iostream>
#include <list>
int main() {
    // 整数型のstd::listを初期化
    std::list<int> numbers = {1, 2, 3, 4, 5};
    // 初期化されたリストの要素を出力
    for (int number : numbers) {
        std::cout << number << " ";
    }
    return 0;
}
1 2 3 4 5

このコードでは、整数型のstd::listを初期化し、範囲for文を使って要素を出力しています。

範囲for文を使ったループの基本例

範囲for文は、コンテナの全要素を簡単にループするための構文です。

以下に基本的な使用例を示します。

#include <iostream>
#include <list>
int main() {
    std::list<std::string> fruits = {"apple", "banana", "cherry"};
    // 範囲for文を使ってリストの要素を出力
    for (const std::string& fruit : fruits) {
        std::cout << fruit << " ";
    }
    return 0;
}
apple banana cherry

この例では、std::listに文字列を格納し、範囲for文で各要素を出力しています。

const修飾子を使ったループ

const修飾子を使うことで、ループ内で要素を変更しないことを保証できます。

以下にその例を示します。

#include <iostream>
#include <list>
int main() {
    std::list<int> numbers = {10, 20, 30, 40, 50};
    // const修飾子を使って要素を出力
    for (const int& number : numbers) {
        std::cout << number << " ";
    }
    return 0;
}
10 20 30 40 50

このコードでは、const修飾子を使って、リストの要素を変更しないことを明示しています。

autoキーワードの活用

autoキーワードを使うことで、型を自動推論させることができます。

これにより、コードがより簡潔になります。

#include <iostream>
#include <list>
int main() {
    std::list<double> values = {1.1, 2.2, 3.3, 4.4, 5.5};
    // autoキーワードを使って要素を出力
    for (auto value : values) {
        std::cout << value << " ";
    }
    return 0;
}
1.1 2.2 3.3 4.4 5.5

この例では、autoキーワードを使って、std::listの要素の型を自動的に推論しています。

これにより、コードがより読みやすくなります。

応用例

std::listの要素を変更する

std::listの要素を範囲for文で変更する場合、要素を参照で取得する必要があります。

以下にその例を示します。

#include <iostream>
#include <list>
int main() {
    std::list<int> numbers = {1, 2, 3, 4, 5};
    // 要素を2倍にする
    for (int& number : numbers) {
        number *= 2;
    }
    // 変更後の要素を出力
    for (const int& number : numbers) {
        std::cout << number << " ";
    }
    return 0;
}
2 4 6 8 10

このコードでは、範囲for文を使って各要素を参照で取得し、2倍にしています。

std::listの要素を削除する

範囲for文では直接要素を削除することはできませんが、remove_if関数を使うことで条件に合致する要素を削除できます。

#include <iostream>
#include <list>
#include <algorithm>
int main() {
    std::list<int> numbers = {1, 2, 3, 4, 5};
    // 偶数を削除
    numbers.remove_if([](int number) { return number % 2 == 0; });
    // 削除後の要素を出力
    for (const int& number : numbers) {
        std::cout << number << " ";
    }
    return 0;
}
1 3 5

この例では、remove_if関数を使って、偶数の要素を削除しています。

std::listの要素を条件付きで処理する

条件に基づいてstd::listの要素を処理することも可能です。

以下にその例を示します。

#include <iostream>
#include <list>
int main() {
    std::list<int> numbers = {1, 2, 3, 4, 5};
    // 3より大きい要素を2倍にする
    for (int& number : numbers) {
        if (number > 3) {
            number *= 2;
        }
    }
    // 処理後の要素を出力
    for (const int& number : numbers) {
        std::cout << number << " ";
    }
    return 0;
}
1 2 3 8 10

このコードでは、if文を使って条件を設定し、3より大きい要素を2倍にしています。

条件付きで要素を処理することで、特定の要素に対してのみ操作を行うことができます。

よくある質問

範囲for文でstd::listの要素を削除できますか?

範囲for文では直接要素を削除することはできません。

範囲for文はコンテナの要素を順に処理するためのものであり、要素の削除には適していません。

要素を削除する場合は、remove_if関数やイテレータを使用することが一般的です。

例えば、std::list<int> numbers; numbers.remove_if([](int n) { return n % 2 == 0; });のように、条件に合致する要素を削除することができます。

範囲for文とイテレータのどちらを使うべきですか?

範囲for文とイテレータはそれぞれ異なる用途に適しています。

範囲for文は、コンテナの全要素を簡単に処理したい場合に便利です。

コードが簡潔になり、可読性が向上します。

一方、イテレータは、要素の削除や挿入、特定の位置へのアクセスが必要な場合に適しています。

操作の内容に応じて、適切な方法を選択することが重要です。

範囲for文でstd::listの要素を参照する方法は?

範囲for文でstd::listの要素を参照するには、要素を参照型で取得する必要があります。

具体的には、for (int& element : list)のように、要素を参照型で宣言します。

これにより、ループ内で要素を変更することが可能になります。

例えば、std::list<int> numbers; for (int& n : numbers) { n *= 2; }のように、要素を参照して操作を行うことができます。

まとめ

この記事では、C++のstd::listを範囲for文でループする方法について詳しく解説しました。

範囲for文を使った基本的なループから、要素の変更や削除、条件付き処理の応用例までを通じて、std::listの操作方法を具体的に理解することができたでしょう。

これを機に、実際のプログラムでstd::listを活用し、効率的なコードを書いてみてはいかがでしょうか。

  • URLをコピーしました!
目次から探す