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

今日もvectorです。

#include <iostream>
#include <vector>

int main() {
  std::vector<int> v;
  for(int i = 0; i < 5; ++i)
    v.push_back(i);

  v.erase(v.begin() + 1); // 先頭の次の要素を削除する
  
  std::cout << "先頭の次を削除" << std::endl;
  for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  v.erase(v.begin() + 2, v.end()); // 先頭の次の次の要素から最後まで削除
  std::cout << "先頭の次の次から最後まで削除" << std::endl;
  for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  v.clear(); // 全部クリア
  std::cout << "全部削除" << std::endl;
  for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;
  
  for(int i = 0; i < 5; ++i)
    v.push_back(i);
  
  std::vector<int> v2;
  v2.assign(v.begin(), v.end());

  std::cout << "assignでvからv2にコピー" << std::endl;
  for(std::vector<int>::iterator it = v2.begin(); it != v2.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;
  
  // insertとassignの違い
  
  std::cout << "insertだと挿入される" << std::endl;
  v2.insert(v2.begin(), v2.begin(), v2.end());
  for(std::vector<int>::iterator it = v2.begin(); it != v2.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  v2.assign(3, 10); // 3個の10だけにする
  std::cout << "assignだとassignしたものだけになる" << std::endl;
  for(std::vector<int>::iterator it = v2.begin(); it != v2.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  std::cout << "reverse_iteratorだと逆順にアクセスできる" << std::endl;
  for(std::vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it)
    std::cout << *it << " ";
  
  return 0;
}

結果

先頭の次を削除
0 2 3 4
先頭の次の次から最後まで削除
0 2
全部削除

assignでvからv2にコピー
0 1 2 3 4
insertだと挿入される
0 1 2 3 4 0 1 2 3 4
assignだとassignしたものだけになる
10 10 10
reverse_iteratorだと逆順にアクセスできる
4 3 2 1 0

おおまかにメソッドを一巡できたかなという感じです。

ついでに、reserve()を試してみました。

#include <iostream>
#include <vector>
#include <time.h>

int main() {
  clock_t t1, t2;
  std::vector<int> v1, v2;

  const int N = 100000000;
  t1 = clock();
  
  for(int j = 0; j < N; ++j) {
    v1.push_back(j);
  }
  
  t2 = clock();
  std::cout << "reserve()なし" << std::endl;
  std::cout << static_cast<double>(t2 - t1) / CLOCKS_PER_SEC << std::endl;

  t1 = clock();
  
  v2.reserve(N);
  for(int j = 0; j < N; ++j) {
    v2.push_back(j);
  }
  
  t2 = clock();
  std::cout << "reserve()あり" << std::endl;
  std::cout << static_cast<double>(t2 - t1) / CLOCKS_PER_SEC << std::endl;

  return 0;
}

結果

reserve()なし
5.912
reserve()あり
4.602

ってことで、いっぱい要素を突っ込むときはあらかじめreserveで領域を確保してからぶっこんだ方が実行時間はちょっと短くなるみたいです。