HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

vectorクラスまとめ

C++でよく使われるvectorクラスだが、メソッドがよく分からなかったので、サンプルを全部詰め込んでみた。

ソースコード

#include <array>
#include <iostream>
#include <vector>

std::vector<int>& init() {
    static std::vector<int> v = {1, 99, 4};
    return v;
}
int dump(const std::vector<int>& v) {
    std::cout << "  elem = {";
    for (int x : v) {
        std::cout << " " << x;
    }
    std::cout << " } ";

    std::cout << "( size = " << v.size();

    std::cout << ", max_size = " << v.max_size();

    std::cout << ", capacity = " << v.capacity();

    std::cout << ", empty = " << v.empty();

    std::cout << " )" << std::endl;
}
void t1() {
    std::vector<int> v1 = init();
    const std::vector<int>& cv1 = v1;

    std::cout << "initial" << std::endl;
    dump(v1);
    
    std::cout << "begin(), end()" << std::endl;
    for (decltype(v1)::iterator i = v1.begin(); i != v1.end(); ++i) {
        std::cout << " " << *i;
    }
    std::cout << std::endl;
    for (decltype(v1)::const_iterator i = cv1.begin(); i != cv1.end(); ++i) {
        std::cout << " " << *i;
    }
    std::cout << std::endl;
    
    std::cout << "rbegin(), rend()" << std::endl;
    for (decltype(v1)::reverse_iterator i = v1.rbegin(); i != v1.rend(); ++i) {
        std::cout << " " << *i;
    }
    std::cout << std::endl;
    for (decltype(v1)::const_reverse_iterator i = cv1.rbegin(); i != cv1.rend(); ++i) {
        std::cout << " " << *i;
    }
    std::cout << std::endl;
}
void t2() {
    const std::vector<int> v1 = init();

    std::cout << "initial" << std::endl;
    dump(v1);
    
    std::cout << "cbegin(), cend()" << std::endl;
    for (decltype(v1)::const_iterator i = v1.cbegin(); i != v1.cend(); ++i) {
        std::cout << " " << *i;
    }
    std::cout << std::endl;
    
    std::cout << "crbegin(), crend()" << std::endl;
    for (decltype(v1)::const_reverse_iterator i = v1.crbegin(); i != v1.crend(); ++i) {
        std::cout << " " << *i;
    }
    std::cout << std::endl;
}
void t3() {
    std::vector<int> v1 = init();

    std::cout << "initial" << std::endl;
    dump(v1);

    std::cout << "v1.resize(5)" << std::endl;
    v1.resize(5);
    dump(v1);

    std::cout << "v1.resize(2)" << std::endl;
    v1.resize(2);
    dump(v1);

    std::cout << "v1.reserve(10)" << std::endl;
    v1.reserve(10);
    dump(v1);

    std::cout << "v1.shrink_to_fit()" << std::endl;
    v1.shrink_to_fit();
    dump(v1);
}
void t4() {
    std::vector<int> v1 = init();

    std::cout << "initial" << std::endl;
    dump(v1);

    std::cout << "v1[0] = 3" << std::endl;
    v1[0] = 3;
    dump(v1);

    std::cout << "v1.at(1)" << std::endl;
    std::cout << "  " << v1.at(1) << std::endl;

    std::cout << "v1.data()" << std::endl;
    int* p = v1.data();
    std::cout << "  *p = " << *p << std::endl;
    std::cout << "  *(++p) = " << *(++p) << std::endl;

    std::cout << "v1.front()" << std::endl;
    int& f = v1.front();
    std::cout << "  f = " << f << std::endl;

    std::cout << "v1.back()" << std::endl;
    int& b = v1.back();
    std::cout << "  b = " << b << std::endl;
}
void t5() {
    std::vector<int> v1 = init();

    std::cout << "initial" << std::endl;
    dump(v1);

    std::cout << "v1.push_back(999)" << std::endl;
    v1.push_back(999);
    dump(v1);

    std::cout << "v1.pop_back()" << std::endl;
    v1.pop_back();
    dump(v1);

    std::cout << "v1.insert(v1.begin() + 1, 9999)" << std::endl;
    v1.insert(v1.begin() + 1, 9999);
    dump(v1);

    std::cout << "v1.erase(v1.begin() + 2)" << std::endl;
    v1.erase(v1.begin() + 2);
    dump(v1);

    std::cout << "v1.clear()" << std::endl;
    v1.clear();
    dump(v1);

    std::cout << "v1.assign({ 4, 3, 2, 1 })" << std::endl;
    const std::array<int, 4> a = { 4, 3, 2, 1 };
    v1.assign(a.begin(), a.end());
    dump(v1);
}
void t6() {
    std::vector<int> v1;
    std::cout << "v1.emplace_back(5)" << std::endl;
    v1.emplace_back(5);
    dump(v1);

    std::vector<int> v2;
    std::cout << "v2.emplace(v2.begin(), 5)" << std::endl;
    v2.emplace(v2.begin(), 5);
    dump(v2);
}
void t7() {
    std::vector<int> v1 = { 1, 2, 3 };
    std::vector<int> v2 = { 4, 5, 6 };
    std::cout << "v1.swap(v2)" << std::endl;
    dump(v1);
    dump(v2);
    v1.swap(v2);
    dump(v1);
    dump(v2);
}
int main() {
    t1();

    t2();

    t3();

    t4();

    t5();

    t6();

    t7();

    return EXIT_SUCCESS;
}

実行結果

initial
  elem = { 1 99 4 } ( size = 3, max_size = 4611686018427387903, capacity = 3, empty = 0 )
begin(), end()
 1 99 4
 1 99 4
rbegin(), rend()
 4 99 1
 4 99 1
initial
  elem = { 1 99 4 } ( size = 3, max_size = 4611686018427387903, capacity = 3, empty = 0 )
cbegin(), cend()
 1 99 4
crbegin(), crend()
 4 99 1
initial
  elem = { 1 99 4 } ( size = 3, max_size = 4611686018427387903, capacity = 3, empty = 0 )
v1.resize(5)
  elem = { 1 99 4 0 0 } ( size = 5, max_size = 4611686018427387903, capacity = 6, empty = 0 )
v1.resize(2)
  elem = { 1 99 } ( size = 2, max_size = 4611686018427387903, capacity = 6, empty = 0 )
v1.reserve(10)
  elem = { 1 99 } ( size = 2, max_size = 4611686018427387903, capacity = 10, empty = 0 )
v1.shrink_to_fit()
  elem = { 1 99 } ( size = 2, max_size = 4611686018427387903, capacity = 2, empty = 0 )
initial
  elem = { 1 99 4 } ( size = 3, max_size = 4611686018427387903, capacity = 3, empty = 0 )
v1[0] = 3
  elem = { 3 99 4 } ( size = 3, max_size = 4611686018427387903, capacity = 3, empty = 0 )
v1.at(1)
  99
v1.data()
  *p = 3
  *(++p) = 99
v1.front()
  f = 3
v1.back()
  b = 4
initial
  elem = { 1 99 4 } ( size = 3, max_size = 4611686018427387903, capacity = 3, empty = 0 )
v1.push_back(999)
  elem = { 1 99 4 999 } ( size = 4, max_size = 4611686018427387903, capacity = 6, empty = 0 )
v1.pop_back()
  elem = { 1 99 4 } ( size = 3, max_size = 4611686018427387903, capacity = 6, empty = 0 )
v1.insert(v1.begin() + 1, 9999)
  elem = { 1 9999 99 4 } ( size = 4, max_size = 4611686018427387903, capacity = 6, empty = 0 )
v1.erase(v1.begin() + 2)
  elem = { 1 9999 4 } ( size = 3, max_size = 4611686018427387903, capacity = 6, empty = 0 )
v1.clear()
  elem = { } ( size = 0, max_size = 4611686018427387903, capacity = 6, empty = 1 )
v1.assign({ 4, 3, 2, 1 })
  elem = { 4 3 2 1 } ( size = 4, max_size = 4611686018427387903, capacity = 6, empty = 0 )
v1.emplace_back(5)
  elem = { 5 } ( size = 1, max_size = 4611686018427387903, capacity = 1, empty = 0 )
v2.emplace(v2.begin(), 5)
  elem = { 5 } ( size = 1, max_size = 4611686018427387903, capacity = 1, empty = 0 )
v1.swap(v2)
  elem = { 1 2 3 } ( size = 3, max_size = 4611686018427387903, capacity = 3, empty = 0 )
  elem = { 4 5 6 } ( size = 3, max_size = 4611686018427387903, capacity = 3, empty = 0 )
  elem = { 4 5 6 } ( size = 3, max_size = 4611686018427387903, capacity = 3, empty = 0 )
  elem = { 1 2 3 } ( size = 3, max_size = 4611686018427387903, capacity = 3, empty = 0 )

参考