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で領域を確保してからぶっこんだ方が実行時間はちょっと短くなるみたいです。