list の基本的使用方法です.奇数の要素を削除するため,単項関数オブジェクト is_odd を定義しています.
#include <stdio.h>
#include <list>
#include <functional>
using namespace std;
class is_odd : public unary_function<int, bool>
{
public:
result_type operator() (argument_type k)
{
return (result_type)(k % 2);
}
};
void print(char *str, list<int> &ls) {
if (ls.empty())
printf(" コンテナ %s は空です\n", str);
else {
list<int>::iterator it;
printf("%s の要素数: %d\n", str, ls.size());
for (it = ls.begin(); it != ls.end(); it++)
printf(" %d", *it);
printf("\n");
}
}
int main()
{
list<int> ls1, ls2;
list<int>::iterator it;
// 要素を最後に追加(サイズは自動的に増加)
printf("**初期設定**\n");
ls1.push_back(0);
ls1.push_back(2);
ls1.push_back(4);
ls1.push_back(3);
ls1.push_back(1);
print("ls1", ls1);
// 2 番目の要素の前,及び,先頭に要素を追加
printf("**2 番目の要素の前,及び,先頭に要素を追加**\n");
it = ls1.begin();
it++;
ls1.insert(it, 5);
ls1.push_front(-1);
print("ls1", ls1);
// 3 番目の要素,最初,及び,最後の要素を削除
printf("**3 番目の要素,最初,及び,最後の要素を削除**\n");
it = ls1.begin();
it++;
it++;
ls1.erase(it);
ls1.pop_front();
ls1.pop_back();
print("ls1", ls1);
// 値が 2 である要素,及び,奇数である要素を削除
printf("**値が 2 である要素,及び,奇数である要素を削除**\n");
ls1.remove(2);
ls1.remove_if(is_odd());
print("ls1", ls1);
// 演算子で比較
printf("**比較**\n");
ls2.push_back(0);
ls2.push_back(4);
print("ls2", ls2);
if (ls1 == ls2)
printf(" 2 つのコンテナ内の要素はすべて等しい\n");
// ls2 の 2 番目の要素を ls1 に代入
printf("**ls2 の 2 番目の要素を ls1 に代入**\n");
it = ls2.begin();
it++;
ls1.assign(it, ls2.end());
print("ls1", ls1);
// ls1 と ls2 を入れ替える
printf("**ls1 と ls2 を入れ替える**\n");
print("入れ替え前:ls1", ls1);
print("入れ替え前:ls2", ls2);
ls1.swap(ls2);
print("ls1", ls1);
print("ls2", ls2);
// ls1 のすべての要素を削除
printf("**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 は空です
list のソートやマージに対する使用方法です.
#include <stdio.h>
#include <list>
#include <functional>
using namespace std;
void print(char *str, list<int> &ls) {
if (ls.empty())
printf("コンテナ %s は空です\n", str);
else {
list<int>::iterator it;
printf("%s の要素数: %d\n", str, ls.size());
for (it = ls.begin(); it != ls.end(); it++)
printf(" %d", *it);
printf("\n");
}
}
int main()
{
list<int> ls1, ls2;
list<int>::iterator it;
// ls1,ls2 の初期化
printf("**初期設定**\n");
ls1.push_back(5);
ls1.push_back(0);
ls1.push_back(2);
ls1.push_back(0);
ls1.push_back(3);
print("ls1", ls1);
ls2.push_back(0);
ls2.push_back(3);
ls2.push_back(0);
ls2.push_back(4);
ls2.push_back(1);
print("ls2", ls2);
// ls1,ls2 のソート
printf("**ls1,ls2 のソート**\n");
ls1.sort(less<int>());
print("ls1", ls1);
ls2.sort(less<int>());
print("ls2", ls2);
// マージ
printf("**マージ**\n");
ls1.merge(ls2, less<int>());
print("ls1", ls1);
print("ls2", ls2);
// 同じ要素を削除
printf("**同じ要素を削除**\n");
ls1.unique();
print("ls1", ls1);
// ls2 の 2 番目の要素を ls1 の 3 番目の要素の前に接続
printf("**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 のソート**
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