菜鸟笔记
提升您的技术认知

std::vector-ag真人游戏

介绍

成员函数

  • 构造析构
  • 元素访问
  • 迭代器
  • 容量
  • 修改器

非成员函数

介绍

// vector 模板定义
template > class vector;
namespace pmr {  // c  17 起
    template 
    using vector = std::vector>;
}
  • vector 介绍摘选自 cppreference.com 中文网 vector 介绍
  • t 必须满足可复制赋值 (copyassignable) 和可复制构造 (copyconstructible) 的要求(c 11 前),泛言之,要求元素类型是完整类型并满足可擦除 (erasable) 的要求,但许多成员函数附带了更严格的要求 (c 11 起)
  • allocator 动态获取/释放内存及构造/析构内存中元素的分配器,若allocator::value_type 与 t 不同则行为未定义
  • 包含在头文件 vector 中,可以理解为动态数组,其内存是动态增长的,当空间不够存储时自动分配内存,分配策略不同编译器实现可能不同,但绝对不是用多少分配多少,这样效率不高
  • 元素是连续存储的,访问元素可以通过迭代器和指针
  • 随机访问复杂度 o(1),在末尾插入或移除元素 o(1),插入或移除元素,与到 vector 结尾的距离成线性 o(n)
  • std::vector (对于 bool 以外的 t )满足容器 (container) 、知分配器容器 (allocatorawarecontainer) 、序列容器 (sequencecontainer) 、连续容器 (contiguouscontainer) (c 17 起)及可逆容器 (reversiblecontainer) 的要求元素的类型

成员函数

构造析构
#include 
int main()
{
    auto print = [](const std::string&msg, const std::vector& vec) { // 打印
        std::cout << msg << " : ";
        for (int val : vec)
            std::cout << val << "\t";
        std::cout << "\n";
    };
    std::vector vec1;  // 默认无参构造
    print("vec1", vec1);
    std::allocator alloc2;
    std::vector vec2(alloc2);  // 指定分配器
    print("vec2", vec2);
    std::vector vec3(5, 10);  // 初始化 5 个元素,每个元素初始化值为 10
    print("vec3", vec3);
    std::vector vec4(5);  // 初始化 5 个元素,每个元素初始化值为 0
    print("vec4", vec4);
    std::vector::iterator itbegin = vec3.begin();
    std::vector::iterator itend = vec3.end();
    std::vector vec5(itbegin, itend);  // 迭代器初始化
    print("vec5", vec5);
    std::vector vec6(vec5);  // 拷贝构造
    print("vec6", vec6);
    std::vector vec7(vec6, alloc2);  // 拷贝构造,指定分配器类型
    print("vec7", vec7);
    std::vector vec8(std::move(vec5));  // 移动构造
    print("vec8", vec8);
    std::vector vec9(std::move(vec6), alloc2);  // 移动构造,指定分配器类型
    print("vec9", vec9);
    std::vector vec10{1,2,3,4,5};  // 初始化列表
    print("vec10", vec10);
	// ~vector(); 默认析构函数
    return 0;
}

输出结果:
vec1 :
vec2 :
vec3 : 10 10 10 10 10
vec4 : 0 0 0 0 0
vec5 : 10 10 10 10 10
vec6 : 10 10 10 10 10
vec7 : 10 10 10 10 10
vec8 : 10 10 10 10 10
vec9 : 10 10 10 10 10
vec10 : 1 2 3 4 5

元素访问
#define cout(msg, x) std::cout< vec{1,2,3,4,5};  // 初始化列表
    cout("vec.at(0) : ", vec.at(0));      // 访问指定下标的元素,同时进行越界检查
    cout("vec[2] : ", vec[2]);            // 访问指定下标的元素
    cout("vec.front() : ", vec.front());  // 访问第一个元素
    cout("vec.back() : ", vec.back());    // 访问最后一个元素
    cout("*vec.data() : ", *vec.data());  // 返回指向内存中数组第一个元素的指针
    return 0;
}

输出结果:
vec.at(0) : 1
vec[2] : 3
vec.front() : 1
vec.back() : 5
*vec.data() : 1

迭代器
int main()
{
    std::vector vec{1,2,3,4,5};  // 初始化列表
    std::vector::iterator iter = vec.begin(); // 返回指向起始的迭代器,读写迭代器
    for (; iter != vec.end();   iter) {
        std::cout << *iter << "\t";
    }
    std::cout << "\n";
    std::vector::const_iterator citer = vec.cbegin();// 返回指向起始的迭代器,只读迭代器
    for (; citer != vec.cend();   citer) {
        std::cout << *citer << "\t";
    }
    std::cout << "\n";
    std::vector::reverse_iterator riter = vec.rbegin();// 逆向返回指向起始的迭代器,读写迭代器
    for (; riter != vec.rend();   riter) {
        std::cout << *riter << "\t";
    }
    std::cout << "\n";
    std::vector::const_reverse_iterator criter = vec.crbegin();// 逆向返回指向起始的迭代器,只读迭代器
    for (; criter != vec.crend();   criter) {
        std::cout << *criter << "\t";
    }
    std::cout << "\n";
    return 0;
}

输出结果:
1 2 3 4 5
1 2 3 4 5
5 4 3 2 1
5 4 3 2 1

容量
int main()
{
    std::vector vec{1,2,3,4,5};  // 初始化列表
    std::cout << std::boolalpha << "vec.empty() : " << vec.empty() << "\n";  // 是否为空
    std::cout << "vec.size() : " << vec.size() << "\n";  // 容器元素数量
    std::cout << "vec.max_size() : " << vec.max_size() << "\n";  // 容器可容纳的最大数量,和平台相关
    std::cout << "vec.capacity() : " << vec.capacity() << "\n";  // 容器容量 >= 容器元素数量
    vec.reserve(20);  // 容器预留空间
    std::cout << "vec.capacity() : " << vec.capacity() << "\n";
    vec.shrink_to_fit();  // 通过释放未使用的内存减少内存的使用
    std::cout << "vec.capacity() : " << vec.capacity() << "\n";
    return 0;
}

输出结果:
vec.empty() : false
vec.size() : 5
vec.max_size() : 4611686018427387903
vec.capacity() : 5
vec.capacity() : 20
vec.capacity() : 5

修改器
int main()
{
    auto print = [](const std::string&msg, const std::vector& vec) { // 打印
        std::cout << msg << " : ";
        for (int val : vec)
            std::cout << val << "\t";
        std::cout << "\n";
    };
    std::vector vec{1,2,3,4,5};  // 初始化列表
    print("origin vec", vec);
    vec.clear();  // 清除容器
    print("vec.clear", vec);
    vec.insert(vec.begin(), {1,2,3,4,5});  // 插入元素,insert 函数有好几个重载函数
    print("vec.insert", vec);
    vec.emplace(vec.end(), 6);  // 原位构造元素
    print("vec.emplace", vec);
    vec.erase(vec.begin(), vec.begin()   1); // 擦除元素
    print("vec.erase", vec);
    vec.push_back(7);  // 将元素添加到容器末尾
    print("vec.push_back", vec);
    vec.emplace_back(8);  // 在容器末尾就地构造元素
    print("vec.emplace_back", vec);
    vec.pop_back();  // 移除末尾元素
    print("vec.pop_back", vec);
    vec.resize(2);  // 改变容器中可存储元素的个数
    print("vec.resize", vec);
    std::vector vec2;
    vec2.swap(vec);
    print("vec2", vec2);
    print("vec", vec);
    return 0;
}

输出结果:
origin vec : 1 2 3 4 5
vec.clear :
vec.insert : 1 2 3 4 5
vec.emplace : 1 2 3 4 5 6
vec.erase : 2 3 4 5 6
vec.push_back : 2 3 4 5 6 7
vec.emplace_back : 2 3 4 5 6 7 8
vec.pop_back : 2 3 4 5 6 7
vec.resize : 2 3
vec2 : 2 3
vec :

非成员函数

int main()
{
    auto print = [](const std::string&msg, const std::vector& vec) { // 打印
        std::cout << msg << " : ";
        for (int val : vec)
            std::cout << val << "\t";
        std::cout << "\n";
    };
    std::vector vec1{1,2,3,4,5};  // 初始化列表
    std::vector vec2{1,2,3,4,6};
    std::cout << std::boolalpha << "vec1 == vec2 : " << (vec1 == vec2) << "\n";
    std::cout << std::boolalpha << "vec1 != vec2 : " << (vec1 != vec2) << "\n";
    std::cout << std::boolalpha << "vec1 > vec2 : " << (vec1 > vec2) << "\n";
    std::cout << std::boolalpha << "vec1 >= vec2 : " << (vec1 >= vec2) << "\n";
    std::cout << std::boolalpha << "vec1 < vec2 : " << (vec1 < vec2) << "\n";
    std::cout << std::boolalpha << "vec1 <= vec2 : " << (vec1 <= vec2) << "\n";
    std::vector vec3;
    std::swap(vec1, vec3); // 交换元素
    print("vec1", vec1);
    print("vec3", vec3);
    return 0;
}

输出结果:
vec1 == vec2 : false
vec1 != vec2 : true
vec1 > vec2 : false
vec1 >= vec2 : false
vec1 < vec2 : true
vec1 <= vec2 : true
vec1 :
vec3 : 1 2 3 4 5

起始

网站地图