C++ STL | 2024.08.13 |
vectorの初期化と参照 |
vectorは、テンプレートパラメータで指定する型の動的な配列を提供する。
vectorの要素を初期化し、配列のように[添字]により参照できる。同様にat()により添字で参照できる。at()では範囲外参照の場合に例外を送出する。
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;
}
#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>(要素数, 初期値)
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;
}
#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;
}
#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;
}
#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;
}
#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()のイテレータは末尾要素ではなく反復の終了を示している。
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;
}
#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からの参照にも反映する。
例の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;
}
#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;
}
#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()が先頭要素の前を示す。
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;
}
#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
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;
}
#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;
}
#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;
}
#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;
}
#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は[]によるランダムなアクセスはできない。
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;
}
#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;
}
#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;
}
#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)のような指定位置のアクセスはできない。
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;
}
#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;
}
#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()に指定するイテレータは削除と同時に参照先が消滅して続きを参照できない。戻り値で返る削除した次の要素のイテレータを得て続きを参照する。
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;
}
#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;
}
#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;
}
#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;
}
#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は自動的に要素をソートした状態で格納している。
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;
}
#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;
#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;
}
#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;
}
#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;
}
#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である。
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;
}
#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
G
B exists
C++ STL | 2024.08.13 |
クラスのset格納 |
setは任意のオブジェクトを格納できる。
ただし、そのクラスにはoperator<()により「<」の比較演算のオーバーロードが実装されている必要がある。例のクラスStrは、operator<()では文字列の長さで大小をしているので、このクラスのオブジェクトを格納するsetのssはStrクラスの文字列メンバstの長さで整列している。
ただし、そのクラスには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;
}
#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
DFG
ABCD
EFGHI
C++ STL | 2024.08.13 |
mapの初期化と参照 |
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;
}
#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;
}
#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;
}
#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
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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}