TENKAIKEN Storehouse

Contents ♪

C++ STL 2024.08.13
vectorの初期化と参照
vectorは、テンプレートパラメータで指定する型の動的な配列を提供する。
vectorの要素を初期化し、配列のように[添字]により参照できる。同様にat()により添字で参照できる。at()では範囲外参照の場合に例外を送出する。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vi = {100, 200, 300, 400};
    vector<string> vs = {"ABC", "DEF", "GHI"};

    cout << vi[2] << endl;      // 300
    cout << vi.at(1) << endl;   // 200
    cout << vs.at(0) << endl;   // ABC
    return 0;
}
C++ STL 2024.08.13
vectorを要素数指定で生成
vectorのコンストラクタで、要素数を指定して確保、あるいは要素数と初期値を指定することができる。
vector<T>(要素数)
vector<T>(要素数, 初期値)
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> via(3);
    via[0] = 100;
    via[1] = 200;
    via[2] = 300;
    cout << via[2] << endl;     // 300

    vector<int> vib(3, 10);
    cout << vib[2] << endl;     // 10

    return 0;
}
C++ STL 2024.08.13
vectorの末尾追加・末尾削除
vectorの要素を追加・削除する。
push_back(要素) 末尾へ追加
pop_back() 末尾を削除
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vi;
    vi.push_back(100);
    vi.push_back(200);
    vi.push_back(300);
    vi.push_back(400);
    vi.pop_back();

    for (int n : vi) {
        cout << n << endl;      // 100 200 300
    }
    return 0;
}
C++ STL 2024.08.13
vectorのサイズ取得・サイズ変更
size()はvectorの現在の要素数を返し、resize(int)は要素数を変更する。resize()で少なくなる方の変更は、末尾の要素が切り詰められる。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vi = {100, 200, 300};

    cout << vi.size() << endl;      // 3
    vi.resize(4);
    cout << vi.size() << endl;      // 4
    vi[3] = 400;
    for (int n : vi) {
        cout << n << endl;          // 100 200 300 400
    }
    return 0;
}
C++ STL 2024.08.13
多次元のvector
vectorのテンプレートパラメータにvectorを指定して多次元vectorを作成する。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<vector<string>> vvs = {
        {"ABC", "あいう"},
        {"DEF", "かきく"},
        {"GHI", "さしす"}
    };

    cout << vvs[1][0] << endl;      // DEF 
    cout << vvs[2][1] << endl;      // さしす 
    return 0;
}
C++ STL 2024.08.13
vectorのイテレータ参照
vectorの要素をイテレータにより参照する。
begin()は先頭要素を参照するイテレータを返し、end()は末尾要素の次を参照するイテレータを返す。end()のイテレータは末尾要素ではなく反復の終了を示している。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vi = {100, 200, 300, 400};

    for (vector<int>::iterator it = vi.begin(); it != vi.end(); it++) {
        cout << *it << endl;        // 100 200 300 400
    }
    return 0;
}
C++ STL 2024.08.13
vectorの参照変数
vectorの参照変数に他のvectorを代入する。
例のvrはviと同じオブジェクトを参照しているので、viの要素の変更はvrからの参照にも反映する。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vi = {100, 200, 300, 400};
    vector<int>& vr = vi;
    vi[1] = 222;

    for (vector<int>::iterator it = vr.begin(); it != vr.end(); it++) {
        cout << *it << endl;        // 100 222 300 400
    }
    return 0;
}
C++ STL 2024.08.13
vectorのイテレータから要素を参照・変更する
イテレータは、ポインタ変数のようにvectorの要素にアクセスできる。vectorのイテレータは加算・減算によりランダムな位置へアクセスできる。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vi = {100, 200, 300, 400};

    vector<int>::iterator it = vi.begin();
    it += 2; 
    *it = 333; 
    cout << vi[2] << endl;          // 333
    cout << *(it - 1) << endl;      // 200
    return 0;
}
C++ STL 2024.08.13
読み出し専用イテレータ・逆方向イテレータ
const_iteratorは、要素を読み出し専用で参照するイテレータで、reverse_iteratorは要素を逆方向から反復するイテレータである。
reverse_iteratorの場合は、rbegin()が末尾要素で、rend()が先頭要素の前を示す。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<string> vs = {"ABC", "DEF", "GHI"};

    for (vector<string>::const_iterator cit = vs.begin(); cit != vs.end(); cit++) {
        //*cit = "abc";         // Error
        cout << *cit << endl;
    }
    for (vector<string>::reverse_iterator rit = vs.rbegin(); rit != vs.rend(); rit++) {
        cout << *rit << endl;
    }

    return 0;
}
ABC
DEF
GHI
GHI
DEF
ABC
C++ STL 2024.08.13
vectorの削除・挿入
erase()は指定するイテレータが参照する要素を削除し、insert()は指定するイテレータの位置に第二引数を挿入する。erase()の戻り値は削除した要素の次を指すイテレータで、insert()の戻り値は挿入した要素を指すイテレータである。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vi = {100, 200, 300, 400};

    vector<int>::iterator it = vi.begin();

    vi.erase(it + 2);
    vi.insert(it + 1, 500);

    for (it = vi.begin(); it != vi.end(); it++) {
        cout << *it << endl;        // 100 500 200 400
    }

    return 0;
}
C++ STL 2024.08.13
vectorの全消去
clear()によりvectorの全ての要素を消去する。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vi = {100, 200, 300};

    vi.clear();
    cout << vi.size() << endl;      // 0

    return 0;
}
C++ STL 2024.08.13
vectorの空判定
empty()はvectorが空の場合trueを返す。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vi = {100, 200, 300};

    vi.clear();
    if (vi.empty())
        cout << "Empty" << endl;        // Empty

    return 0;
}
C++ STL 2024.08.13
vectorをforで反復参照する
C++11で導入されたfor文では、イテレータを実装するコンテナオブジェクトを反復して参照できる。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vi = {100, 200, 300};

    for (vector<int>::iterator it = vi.begin(); it != vi.end(); it++) {
        cout << *it << endl;        // 100 200 300
    }
    for (int n : vi) {
        cout << n << endl;          // 100 200 300
    }

    return 0;
}
C++ STL 2024.08.13
listの初期化とイテレータ参照
listは、テンプレートパラメータで指定する型の双方向リストを提供する。
listの要素を初期化し、イテレータにより順に参照する。listは[]によるランダムなアクセスはできない。
#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> li = {10, 20, 30, 40};

    for (list<int>::iterator it = li.begin(); it != li.end(); it++) {
        cout << *it << endl;        // 10 20 30 40
    }

    return 0;
}
C++ STL 2024.08.13
listの先頭・末尾の追加・削除
listの先頭・末尾に要素を追加・削除する。
push_back(要素) 末尾へ追加
push_front(要素) 先頭へ追加
pop_back() 末尾を削除
pop_front() 先頭を削除
#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> li;

    li.push_front(30);
    li.push_front(20);
    li.push_front(10);
    li.push_back(40);
    li.push_back(50);
    li.pop_back();
    li.pop_front();
    for (int n : li) {
        cout << n << endl;      // 20 30 40
    }

    return 0;
}
C++ STL 2024.08.13
listのサイズ取得・サイズ変更
size()はlistの現在の要素数を返し、resize(int)は要素数を変更する。resize()で少なくなる方の変更は、末尾の要素が切り詰められる。
#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> li = {10, 20, 30, 40};

    cout << li.size() << endl;      // 4
    li.resize(3);
    for (int n : li) {
        cout << n << endl;          // 10 30 40
    }

    return 0;
}
C++ STL 2024.08.13
listのイテレータから要素を参照・変更する
イテレータは、ポインタ変数のようにlistの要素にアクセスできる。
listのイテレータは双方向イテレータであり、vectorのイテレータ(ランダムアクセス)とは異なり、*(it + 2)のような指定位置のアクセスはできない。
#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> li = {10, 20, 30, 40};

    list<int>::iterator it = li.begin();
    it++;
    *it = 200; 
    for (it = li.begin(); it != li.end(); it++) {
        cout << *it << endl;        // 10 200 30 40
    }

    return 0;
}
C++ STL 2024.08.13
listの指定値の要素を削除する
remove()は引数で指定するデータと同値の要素をlistから削除する。
#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> li = {-1, 20, -1, 40};

    li.remove(-1);
    for (int n : li) {
        cout << n << endl;          // 20 40
    }

    return 0;
}
C++ STL 2024.08.13
listの削除・挿入
erase()は指定するイテレータが参照する要素を削除し、insert()は指定するイテレータの位置に第二引数を挿入する。
erase()の戻り値は削除した要素の次を指すイテレータで、insert()の戻り値は挿入した要素を指すイテレータである。erase()に指定するイテレータは削除と同時に参照先が消滅して続きを参照できない。戻り値で返る削除した次の要素のイテレータを得て続きを参照する。
#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> li = {10, 20, 30, 40};

    list<int>::iterator it = li.begin();

    it = li.erase(++it);
    li.insert(++it, 300);
    for (int n : li) {
        cout << n << endl;          // 10 30 300 40
    }

    return 0;
}
C++ STL 2024.08.13
listの全消去
clear()によりlistの全ての要素を消去する。
#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> li = {10, 20, 30, 40};

    li.clear();
    cout << li.size() << endl;      // 0

    return 0;
}
C++ STL 2024.08.13
listの空判定
empty()はlistが空の場合trueを返す。
#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> li = {10, 20, 30, 40};

    li.clear();
    if (li.empty())
        cout << "Empty" << endl;        // Empty

    return 0;
}
C++ STL 2024.08.13
listのソート
sort()はlistをソートして並べ替える。
#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> li = {5, 9, 2, 1, 4};

    li.sort();
    for (int n : li) {
        cout << n << endl;      // 1 2 4 5 9
    }

    return 0;
}
C++ STL 2024.08.13
setの初期化とイテレータ参照
setは、重複しないオブジェクトの集合を提供する。
setの要素間は重複せず全て一意である。重複のあるデータ列から初期化すると一意になるよう整理される。重複するデータの追加は無視される。setは自動的に要素をソートした状態で格納している。
#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<int> si = {10, 30, 20, 50, 10, 40, 30};

    for (set<int>::iterator it = si.begin(); it != si.end(); it++) {
        cout << *it << endl;        // 10 20 30 40 50
    }

    return 0;
}
C++ STL 2024.08.13
setの追加・削除
setに要素を追加・削除する。
insert(要素)  追加
erase(要素)  削除
erase(イテレータ) イテレータの示す要素をsetから削除
#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<string> ss;

    ss.insert("ABC");
    ss.insert("DEF");
    ss.insert("GHI");
    ss.insert("DEF");
    ss.erase("GHI");

    for (string s : ss) { 
        cout << s << endl;      // ABC DEF
    }

    set<string>::iterator it = ss.find("ABC");
    ss.erase(it);

    for (string s : ss) { 
        cout << s << endl;      // DEF
    }

    return 0;
C++ STL 2024.08.13
setのサイズ
size()はsetの現在の要素数を返す。
#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<string> ss = {"ABC", "DEF", "GHI"};

    cout << ss.size() << endl;      // 3

    return 0;
}
C++ STL 2024.08.13
setの全削除
clear()によりsetの全ての要素を消去する。
#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<string> ss = {"ABC", "DEF", "GHI"};

    ss.clear();
    cout << ss.size() << endl;      // 0

    return 0;
}
C++ STL 2024.08.13
setの空チェック
empty()はsetが空の場合trueを返す。
#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<string> ss = {"ABC", "DEF", "GHI"};

    ss.clear();
    if (ss.empty())
        cout << "Empty" << endl;        // Empty

    return 0;
}
C++ STL 2024.08.13
setの検索
find(値)は、引数で指定する値と同値の要素を探し、イテレータを返す。存在しなかった場合はend()が返る。
count(値)は引数の値がsetに含まれる個数を返す。setは重複しない集合なので存在すれば常に1を返し、存在しなければ0である。
#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<string> ss = {"N", "B", "G", "F", "K"};

    set<string>::iterator it = ss.find("C");
    if (it == ss.end())
        cout << "not found" << endl;
    it = ss.find("G");
    cout << *it << endl;
    if (ss.count("B") > 0)
        cout << "B exists" << endl;

    return 0;
}
not found
G
B exists
C++ STL 2024.08.13
クラスのset格納
setは任意のオブジェクトを格納できる。
ただし、そのクラスにはoperator<()により「<」の比較演算のオーバーロードが実装されている必要がある。例のクラスStrは、operator<()では文字列の長さで大小をしているので、このクラスのオブジェクトを格納するsetのssはStrクラスの文字列メンバstの長さで整列している。
#include <iostream>
#include <set>
using namespace std;

class Str {
public:
    Str(string s) { st = s; } 
    void show() { cout << st << endl; }
    bool operator<(const Str& other) const {
        return st.length() < other.st.length();
    }
private:
    string st;
};

int main()
{
    set<Str> ss = {Str("ABCD"), Str("DFG"), Str("EFGHI"), Str("OP")};

    for (Str s : ss) { 
        s.show();
    }

    return 0;
}
OP
DFG
ABCD
EFGHI
C++ STL 2024.08.13
mapの初期化と参照
mapは、連想配列(あるいは辞書)を提供する。
テンプレートパラメータは最初が連想配列のキーの型で、次がキーに対応する値の型である。mapを配列の添字にキーを指定すると、キーに対応して格納される値が参照できる。
#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> msi;

    msi["AB"] = 10;
    msi["CD"] = 20;
    msi["EF"] = 30;

    cout << msi["CD"] << endl;      // 20
    cout << msi["EF"] << endl;      // 30
    return 0;
}
C++ STL 2024.08.13
mapのpairによる初期化
mapの要素はキーと値の組み合わせをstd::pair<T,U>で格納している。insert()にpairオブジェクトを与えることでmapの要素を追加できる。
#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> msi;

    msi.insert(pair<string, int>("AB", 10));
    msi.insert(pair<string, int>("CD", 20));
    msi.insert(pair<string, int>("EF", 30));

    cout << msi["AB"] << endl;      // 10
    cout << msi["EF"] << endl;      // 30
    return 0;
}
C++ STL 2024.08.13
mapのイテレータ参照
mapのイテレータは要素をstd::pairで参照する。pairの前要素はfirstメンバ、後要素はsecondメンバで参照できる。mapのイテレータからfirstの参照がキーを、secondの参照がキーの値を参照する。
#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> msi;

    msi["AB"] = 10;
    msi["CD"] = 20;
    msi["EF"] = 30;

    for (map<string, int>::iterator it = msi.begin(); it != msi.end(); it++) {
        cout << it->first << it->second << endl;
    }

    return 0;
}
AB10
CD20
EF30
C++ STL 2024.08.13
mapの値変更
mapは既存のキーで参照し値を変更できる。
#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> msi;

    msi["AB"] = 10;
    msi["CD"] = 20;
    msi["EF"] = 30;
    msi["CD"] = 200;

    for (map<string, int>::iterator it = msi.begin(); it != msi.end(); it++) {
        cout << msi[it->first] << endl;     // 10 200 30
    }
    return 0;
}
C++ STL 2024.08.13
mapの削除
mapから要素を削除する。
erase(キー) キーの要素を削除
erase(イテレータ) イテレータの示す要素を削除
#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> msi;

    msi["AB"] = 10;
    msi["CD"] = 20;
    msi["EF"] = 30;
    msi["GH"] = 40;
    msi.erase("EF");

    map<string, int>::iterator it = msi.find("CD");
    msi.erase(it);

    for (it = msi.begin(); it != msi.end(); it++) {
        cout << msi[it->first] << endl;     // 10 40
    }
    return 0;
}
C++ STL 2024.08.13
mapのサイズ
size()はmapの要素数を返す。
#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> msi;

    msi["AB"] = 10;
    msi["CD"] = 20;
    msi["EF"] = 30;

    cout << msi.size() << endl;     // 3

    return 0;
}
C++ STL 2024.08.13
mapの全削除
clear()によりmapの全ての要素を消去する。
#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> msi;

    msi["AB"] = 10;
    msi["CD"] = 20;
    msi["EF"] = 30;

    msi.clear();
    cout << msi.size() << endl;     // 0

    return 0;
}
C++ STL 2024.08.13
mapの空チェック
empty()はmapが空の場合trueを返す。
#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> msi;

    msi["AB"] = 10;
    msi["CD"] = 20;
    msi["EF"] = 30;

    msi.clear();
    if (msi.empty())
        cout << "Empty" << endl;        // Empty

    return 0;
}
C++ STL 2024.08.13
mapの検索
find(キー)は、引数で指定するキーを持つ要素を探し、イテレータを返す。存在しなかった場合はend()が返る。
#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> msi;

    msi["AB"] = 10;
    msi["CD"] = 20;
    msi["EF"] = 30;

    map<string, int>::iterator it = msi.find("GH");
    if (it == msi.end())
        cout << "not found" << endl;
    it = msi.find("AB");
    cout << msi[it->first] << endl;

    return 0;
}
C++ STL 2024.08.13
mapをforで反復参照する
C++11で導入されたfor文では、イテレータを実装するコンテナオブジェクトを反復して参照できる。forで反復するmapのイテレータが指す要素は、キーと値の組み合わせのstd::pair<T,U>である。
#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> msi;

    msi["AB"] = 10;
    msi["CD"] = 20;
    msi["EF"] = 30;
    msi["GH"] = 40;

    for (const pair<string, int>& e : msi)
        cout << msi[e.first] << endl;       // 10 20 30 40

    return 0;
}