STLをいろいろ使ってみようと思います 第1回 vector(1)

第一回はvectorを取り上げたいと思います。

まずは基本的な使い方。

#include <iostream>
#include <vector>

int main() {
  std::vector<int> v;
  v.push_back(1); // push_backで要素を末尾に追加
  v.push_back(2);
  v.push_back(3);

  std::cout << std::endl << "イテレータでアクセス" << std::endl;
  for(std::vector<int>::iterator it = v.begin(); // イテレータで要素にアクセス可能 begin()は先頭要素を指すイテレータを返す
      it != v.end(); ++it) // end()は最後尾の次を指すイテレータを返す イテレータをインクリメントすると今指しているようその次を指す
    std::cout << *it << std::endl; // イテレータに*をつけると指している要素を得られる
  
  v.pop_back(); // pop_backで最後の要素を削除する

  std::cout << std::endl << "at()でアクセス" << std::endl;
  for(size_t i = 0; i < v.size(); ++i)
    std::cout << v.at(i) << std::endl; // at(i)でもアクセス可能

  std::cout << std::endl;

  // 状態を知る
  std::cout << "v.size() " << v.size() << std::endl; // 要素数
  std::cout << "v.max_size() " << v.max_size() << std::endl; // 確保可能な要素数
  std::cout << "v.capacity() " << v.capacity() << std::endl; // すでに確保された領域の大きさ
  std::cout << "v.empty() " << v.empty() << std::endl; // 空っぽかどうか

  std::cout << std::endl;

  // front / back
  std::cout << "v.front() " << v.front() << std::endl; // 最初の要素
  std::cout << "v.back() " << v.back() << std::endl; // 最後の要素

  // at()やoperator[]やfrontやbackで得られるのは要素の参照なので代入とかすると変更できる。
  v.at(1) = 11;
  int& f = v.front();
  f = 100;

  std::cout << std::endl << "[]でアクセス" << std::endl;
  for(int i = 0; i < v.size(); ++i)
    std::cout << v[i] << std::endl;
  
  // insert()で要素を挿入
  v.insert(v.begin() + 1, 99); // v.begin()の後ろに99を挿入する
  v.insert(v.begin() + 1, 2, 888); // v.begin()の後ろに888を2個挿入する
  v.insert(v.end(), v.begin(), v.end()); // v.end()の位置にv.begin()からv.end()の一個前までを挿入する

  std::cout << std::endl << "挿入後" << std::endl;
  for(std::vector<int>::iterator it = v.begin(); // イテレータで要素にアクセス可能 begin()は先頭要素を指すイテレータを返す
      it != v.end(); ++it) // end()は最後尾の次を指すイテレータを返す イテレータをインクリメントすると今指しているようその次を指す
    std::cout << *it << std::endl; // イテレータに*をつけると指している要素を得られる
  return 0;
}

結果

イテレータでアクセス
1
2
3

at()でアクセス
1
2

v.size() 2
v.max_size() 1073741823
v.capacity() 4
v.empty() 0

v.front() 1
v.back() 2

[]でアクセス
100
11

挿入後
100
888
888
99
11
100
888
888
99
11

とりあえず一回目はこのくらいで終わります。