C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のSTLで配列とベクトルを操作する方法|合計・最大値・最小値・ソート

配列とベクトルは、競技プログラミングで問題を解くうえで非常に重要なデータ構造です。C++のSTL(Standard Template Library:標準テンプレートライブラリ)には、これらに対してさまざまな操作を簡単に行える便利な関数が多数用意されています。

この記事では、その中でも特によく使われる「合計・最大値・最小値を求める関数」と「ソート関数」の使い方を、サンプルコードと実行結果つきで解説します。

合計・最大値・最小値を求める

STLには、配列やベクトルの合計・最大値・最小値を求めるための関数が用意されています。それぞれ以下のように使用します。

合計を求める:accumulate()

accumulate(startIndex, endIndex, initialSum)

第1引数から第2引数の直前までの範囲にある要素を合計します。第3引数は合計の初期値で、通常は0を指定します。

最大値を求める:max_element()

*max_element(startIndex, endIndex)

最小値を求める:min_element()

*min_element(startIndex, endIndex)

max_element() と min_element() は、最大・最小の要素を指すイテレータを返します。そのため、先頭に間接演算子「*」を付けて実際の値を取り出します。

配列への適用例

#include <bits/stdc++.h>
using namespace std;

int main(){
    int array[] = {65, 7, 12, 90, 31, 113};
    int l = sizeof(array) / sizeof(array[0]);

    cout << "配列の要素: ";
    for(int i = 0; i < l; i++)
        cout << array[i] << "\t";
    cout << endl;

    cout << "配列の全要素の合計: " << accumulate(array, array + l, 0) << endl;
    cout << "配列の最大値: " << *max_element(array, array + l) << endl;
    cout << "配列の最小値: " << *min_element(array, array + l) << endl;

    return 0;
}

出力

配列の要素: 65	7	12	90	31	113
配列の全要素の合計: 318
配列の最大値: 113
配列の最小値: 7

ベクトルへの適用例

#include <bits/stdc++.h>
using namespace std;

int main(){
    vector<int> vec = {65, 7, 12, 90, 31, 113};

    cout << "ベクトルの全要素の合計: " << accumulate(vec.begin(), vec.end(), 0) << endl;
    cout << "ベクトルの最大値: " << *max_element(vec.begin(), vec.end()) << endl;
    cout << "ベクトルの最小値: " << *min_element(vec.begin(), vec.end()) << endl;

    return 0;
}

出力

ベクトルの全要素の合計: 318
ベクトルの最大値: 113
ベクトルの最小値: 7

配列の場合はポインタ(array + l)、ベクトルの場合はイテレータ(vec.begin()・vec.end())で範囲を指定する点に注意してください。

配列・ベクトルの要素をソートする

STLの sort() 関数を使うと、配列やベクトルの要素を簡単に並べ替えることができます。デフォルトでは昇順にソートされ、内部的にはクイックソートをベースとしたイントロソート(クイックソート・ヒープソート・挿入ソートを組み合わせた手法)が採用されており、計算量は O(n log n) です。

構文

sort(startIndex, endIndex)

降順でソートしたい場合は、第3引数に比較関数 greater<int>() を指定します。

sort(vec.begin(), vec.end(), greater<int>());

配列のソート例

#include <bits/stdc++.h>
using namespace std;

int main(){
    int array[] = {65, 7, 12, 90, 31, 113};
    int l = sizeof(array) / sizeof(array[0]);

    cout << "ソート前の配列: ";
    for(int i = 0; i < l; i++)
        cout << array[i] << "\t";
    cout << endl;

    sort(array, array + l);

    cout << "ソート後の配列: ";
    for(int i = 0; i < l; i++)
        cout << array[i] << "\t";
    cout << endl;

    return 0;
}

出力

ソート前の配列: 65	7	12	90	31	113
ソート後の配列: 7	12	31	65	90	113

ベクトルのソート例

#include <bits/stdc++.h>
using namespace std;

int main(){
    vector<int> vec = {65, 7, 12, 90, 31, 113};

    cout << "ソート前のベクトル: ";
    for(int i = 0; i < vec.size(); i++)
        cout << vec[i] << "\t";
    cout << endl;

    sort(vec.begin(), vec.end());

    cout << "ソート後のベクトル: ";
    for(int i = 0; i < vec.size(); i++)
        cout << vec[i] << "\t";
    cout << endl;

    return 0;
}

出力

ソート前のベクトル: 65	7	12	90	31	113
ソート後のベクトル: 7	12	31	65	90	113

まとめ

STLの accumulate()・max_element()・min_element()・sort() を使えば、配列やベクトルに対する頻出処理をわずか数行で実装できます。競技プログラミングでは実装時間の短縮がそのまま成績につながるため、これらの関数の使い方は必ずマスターしておきましょう。

  1. C++で数値と「+」「-」演算子のみを含む配列式を評価する方法

    この記事では、n個の文字列要素からなる配列 arr[] で表現された数式を評価する方法を解説します。配列の各要素は、数値、または演算子「+」「-」のいずれかであり、これらを順に処理して最終的な計算結果を求めるのが課題です。問題の概要与えられる式には、数値・「+」記号・「-」記号のみが含まれます。括弧や乗除算は考慮せず、左から順に加減算を適用していきます。入力例arr = {5, +, 2, -, 8, +, 9}出力例8解説この式は 5 + 2 - 8 + 9 = 8 として評価されます。解法アプローチ解き方はシンプルです。配列を先頭から順に走査し、各演算子に応じて加算または減算を実行します。

  2. C++のSTLを使って配列が回文かどうかを判定するプログラム

    整数 n 個からなる配列 arr[n] が与えられたとき、「その配列は回文(パリンドローム)か?」を判定するのが本稿のテーマです。C++ の STL(標準テンプレートライブラリ)を活用して、この問題をシンプルに解いていきます。 STLとは STL(Standard Template Library)は、C++ に用意されたテンプレートクラスの集合体で、スタック・キュー・リストといったデータ構造や、ソート・反転などの便利な関数を提供します。これらを活用するには、テンプレートクラスに関する基本的な知識が必要です。本稿では、STL の reverse() 関数を使って配列を反転させています。 回文と