template <class T, class Allocator = allocator<T>>
class list
#include <list>
using namespace std;
list <T> 変数名;
list<int> x; // 空の list
list<int> x(3); // 要素数が 3,C++11
list<int> x(5, 10); // 5 つの要素を 10 で初期化,C++11
list<int> x(y.it1, y.it2); // it1 から it2 の範囲で初期化
list<int> x(y); // list y で初期化
list<int> x ({1, 2, 3}); // 初期化子リスト,C++11
list<int> x {1, 2, 3}; // 初期化子リスト,C++11
list<int> x = {1, 2, 3}; // 初期化子リスト,C++11
list<pair<int, double>> lst; lst.emplace(lst.begin(), 5, 3.14); lst.emplace(lst.begin(), make_pair(5, 3.14)); lst.insert(lst.begin(), make_pair(10, 1.23)); for (auto x : lst) cout << x.first << " " << x.second << endl;
= == < <= != > >=
#include <iostream>
#include <list>
using namespace std;
//bool is_odd(int x) {
// return x % 2 > 0;
//}
class is_odd : public unary_function<int, bool>
{
public:
result_type operator() (argument_type k)
{
return (result_type)(k % 2);
}
};
void print(string str, list<int> &ls) {
if (ls.empty())
cout << " コンテナ " << str << " は空です\n";
else {
cout << str << " の要素数: " << ls.size() << endl;
for (auto x : ls)
cout << " " << x;
// list<int>::iterator it;
// for (it = ls.begin(); it != ls.end(); it++)
// cout << " " << *it;
cout << endl;
}
}
int main()
{
// 要素を最後に追加(サイズは自動的に増加)
cout << "**初期設定**\n";
list<int> ls1;
ls1.push_back(0);
ls1.push_back(2);
ls1.push_back(4);
ls1.push_back(3);
ls1.push_back(1);
print("ls1", ls1);
// list<int> ls1 = {0, 2, 4, 3, 1};
// 2 番目の要素の前,及び,先頭に要素を追加
cout << "**2 番目の要素の前,及び,先頭に要素を追加**\n";
list<int>::iterator it = ls1.begin();
it++;
ls1.insert(it, 5);
// ls1.emplace(it, 5);
ls1.push_front(-1);
print("ls1", ls1);
// 3 番目の要素,最初,及び,最後の要素を削除
cout << "**3 番目の要素,最初,及び,最後の要素を削除**\n";
it = ls1.begin();
it++;
it++;
ls1.erase(it);
ls1.pop_front();
ls1.pop_back();
print("ls1", ls1);
// 値が 2 である要素,及び,奇数である要素を削除
cout << "**値が 2 である要素,及び,奇数である要素を削除**\n";
ls1.remove(2);
ls1.remove_if(is_odd()); // 単項関数オブジェクト
// ls1.remove_if(is_odd); // 関数
// ls1.remove_if([](int x){ return x%2 > 0; }); // ラムダ式
print("ls1", ls1);
// 演算子で比較
cout << "**比較**\n";
list<int> ls2 = {0, 4};
print("ls2", ls2);
if (ls1 == ls2)
cout << " 2 つのコンテナ内の要素はすべて等しい\n";
// ls2 の 2 番目の要素を ls1 に代入
cout << "**ls2 の 2 番目の要素を ls1 に代入**\n";
it = ls2.begin();
it++;
ls1.assign(it, ls2.end());
print("ls1", ls1);
// ls1 と ls2 を入れ替える
cout << "**ls1 と ls2 を入れ替える**\n";
print("入れ替え前:ls1", ls1);
print("入れ替え前:ls2", ls2);
ls1.swap(ls2);
print("ls1", ls1);
print("ls2", ls2);
// ls1 のすべての要素を削除
cout << "**ls1 のすべての要素を削除**\n";
ls1.clear();
print("ls1", ls1);
return 0;
}
**初期設定** ls1 の要素数: 5 0 2 4 3 1 **2 番目の要素の前,及び,先頭に要素を追加** ls1 の要素数: 7 -1 0 5 2 4 3 1 **3 番目の要素,最初,及び,最後の要素を削除** ls1 の要素数: 4 0 2 4 3 **値が 2 である要素,及び,奇数である要素を削除** ls1 の要素数: 2 0 4 **比較** ls2 の要素数: 2 0 4 2 つのコンテナ内の要素はすべて等しい **ls2 の 2 番目の要素を ls1 に代入** ls1 の要素数: 1 4 **ls1 と ls2 を入れ替える** 入れ替え前:ls1 の要素数: 1 4 入れ替え前:ls2 の要素数: 2 0 4 ls1 の要素数: 2 0 4 ls2 の要素数: 1 4 **ls1 のすべての要素を削除** コンテナ ls1 は空です
#include <iostream>
#include <list>
#include <functional>
using namespace std;
void print(string str, list<int> &ls) {
if (ls.empty())
cout << "コンテナ " << str << " は空です\n";
else {
cout << str << " の要素数: " << ls.size() << endl;
for (auto x : ls)
printf(" %d", x);
printf("\n");
}
}
int main()
{
// ls1,ls2 の初期化
cout << "**初期設定**\n";
list<int> ls1 = {5, 0, 2, 0, 3};
print("ls1", ls1);
list<int> ls2 = {0, 3, 0, 4, 1};
print("ls2", ls2);
// ls1,ls2 の sort
cout << "**ls1,ls2 の sort**\n";
ls1.sort(less<int>()); // 二項関数オブジェクト less
print("ls1", ls1);
ls2.sort(less<int>());
print("ls2", ls2);
// マージ
cout << "**マージ**\n";
ls1.merge(ls2, less<int>());
print("ls1", ls1);
print("ls2", ls2);
// 同じ要素を削除
cout << "**同じ要素を削除**\n";
ls1.unique();
print("ls1", ls1);
// ls2 の 2 番目の要素を ls1 の 3 番目の要素の前に接続
cout << "**ls2 の 2 番目の要素を ls1 の 3 番目の要素の前に接続**\n";
ls2.push_back(6);
ls2.push_back(7);
ls2.push_back(8);
print("ls2", ls2);
list<int>::iterator it1;
it1 = ls1.begin();
it1++;
it1++;
list<int>::iterator it2;
it2 = ls2.begin();
it2++;
ls1.splice(it1, ls2, it2);;
print("ls1", ls1);
print("ls2", ls2);
return 0;
}
**初期設定** ls1 の要素数: 5 5 0 2 0 3 ls2 の要素数: 5 0 3 0 4 1 **ls1,ls2 の sort** ls1 の要素数: 5 0 0 2 3 5 ls2 の要素数: 5 0 0 1 3 4 **マージ** ls1 の要素数: 10 0 0 0 0 1 2 3 3 4 5 コンテナ ls2 は空です **同じ要素を削除** ls1 の要素数: 6 0 1 2 3 4 5 **ls2 の 2 番目の要素を ls1 の 3 番目の要素の前に接続** ls2 の要素数: 3 6 7 8 ls1 の要素数: 7 0 1 7 2 3 4 5 ls2 の要素数: 2 6 8
| 菅沼ホーム | 本文目次 | 演習問題解答例 | 付録目次 | 索引 |