STLをいろいろ使ってみようと思います 第3回 list

今回はlistです。

#include <iostream>
#include <list>

int main() {
  std::list<int> l;
  
  // vector同様push_back()で要素を追加できる
  l.push_back(1);
  l.push_back(2);

  // push_front()でも追加可能
  l.push_front(3);
  l.push_front(4);

  std::cout << "要素を追加" << std::endl;
  // vector同様iteratorでアクセス可能
  for(std::list<int>::iterator it = l.begin(); it != l.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  // pop_front()で先頭要素を削除
  l.pop_front();
  
  // pop_back()で最終要素を削除
  l.pop_back();

  std::cout << "先頭 : " << l.front() // 先頭要素への参照
	    << " 最終 : " << l.back() << std::endl; // 最終要素への参照

  l.clear(); // clear()で全消去

  l.assign(10, 5);
  for(std::list<int>::iterator it = l.begin(); it != l.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;
  
  l.push_back(1);
  l.push_back(2);
  l.push_back(3);
  l.push_back(4);
  
  l.remove(5); // "5"の要素をすべて削除
  for(std::list<int>::iterator it = l.begin(); it != l.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  l.remove_if([](int i){return i % 2;}); // 奇数をすべて削除
  for(std::list<int>::iterator it = l.begin(); it != l.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  l.erase(l.begin(), l.end()); // 最初から最後まで削除

  l.push_back(1);
  l.push_back(2);
  l.push_back(3);
  l.push_back(4);
  l.push_back(5);
  l.push_back(6);
  l.push_back(7);

  std::list<int> l2;
  l2.push_back(3);
  l2.push_back(6);
  l2.push_back(9);

  // lの最初の要素の次にl2を挿入する
  l.splice(++l.begin(), l2);
  for(std::list<int>::iterator it = l.begin(); it != l.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  // l2の中身はからになる
  for(std::list<int>::iterator it = l2.begin(); it != l2.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  l2.push_back(3);
  l2.push_back(6);
  l2.push_back(9);
  
  l.insert(++l.begin(), l2.begin(), l2.end());
  for(std::list<int>::iterator it = l.begin(); it != l.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl; 

  // insertならl2の中身は空にならない
  for(std::list<int>::iterator it = l2.begin(); it != l2.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;
  
  l.sort(); // sort()でソートできる
  for(std::list<int>::iterator it = l.begin(); it != l.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  // merge()で良い感じに挿入される
  l.merge(l2);
  for(std::list<int>::iterator it = l.begin(); it != l.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  // unique()でダブりをなくす
  l.unique();
  for(std::list<int>::iterator it = l.begin(); it != l.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  return 0;
}

結果

要素を追加
4 3 1 2
先頭 : 3 最終 : 1
5 5 5 5 5 5 5 5 5 5
1 2 3 4
2 4
1 3 6 9 2 3 4 5 6 7

1 3 6 9 3 6 9 2 3 4 5 6 7
3 6 9
1 2 3 3 3 4 5 6 6 6 7 9 9
1 2 3 3 3 3 4 5 6 6 6 6 7 9 9 9
1 2 3 4 5 6 7 9

あんまり使ったこと無かったんですが、sortとuniqueがそのまま使えるのは便利なきがします