C++初阶之一篇文章让你掌握vector(理解和使用)

2024-02-27 1687阅读

温馨提示:这篇文章已超过443天没有更新,请注意相关的内容是否还可用!

C++初阶之一篇文章让你掌握vector(理解和使用)

vector(理解和使用)

  • 1.什么是vector?
  • 2.vector的使用
    • 2.1 vector构造函数
    • 2.2 vector迭代器(Iterators)函数
      • 2.2.1 begin()
      • 2.2.2 end()
      • 2.2.3 rbegin()
      • 2.2.4 rend()
      • 2.2.5 cbegin()、cend()、crbegin()和crend() C++11
      • 2.3 vector容量函数
      • 2.4 vector元素访问函数
        • 2.4.1 operator[]
        • 2.4.2 at
        • 2.4.3 front()
        • 2.4.4 back()
        • 2.4.5 data() C++11
        • 2.5 vector增删查改函数
          • 2.5.1 assign()
          • 2.5.2 push_back()
          • 2.5.3 pop_back()
          • 2.5.4 insert()
          • 2.5.5 erase()
          • 2.5.6 swap()
          • 2.5.7 clear()
          • 2.5.8 emplace() C++11
          • 2.5.9 emplace_back() C++11
          • 2.5.10 vector 迭代器失效问题
          • 结语

            1.什么是vector?

            在C++中,std::vector是标准模板库(STL)中的一种动态数组容器,它可以存储任意类型的元素,并且能够自动调整大小。std::vector提供了许多方便的成员函数,使得对数组的操作更加简单和高效。

            C++初阶之一篇文章让你掌握vector(理解和使用)

            vector声明:

            template ;

            这是 std::vector 的一般模板定义。它使用了两个模板参数 T 和 Alloc,其中 T 表示容器中存储的元素类型,Alloc 表示容器的内存分配器类型,默认为 std::allocator。该模板定义了一个通用的 vector 类模板,用于存储任意类型的元素。

            template class vector;

            这是特化版本的 std::vector,用于存储 bool 类型的元素。这是因为 C++ 中的 std::vector 不能直接存储布尔类型,而是使用了一种特殊的实现来节省空间。这个特化版本接受一个模板参数 Alloc,表示容器的内存分配器类型,但是对于 std::vector 来说,这个分配器类型实际上不会影响它的内部实现,因为 std::vector 会进行特殊优化来节省空间。

            总结:

            template ; 是 std::vector 的一般模板定义,用于存储任意类型的元素。

            template class vector; 是特化版本的 std::vector,用于存储 bool 类型的元素。

            特点和优势:

            动态数组:std::vector内部实现了动态内存管理,可以根据需要自动调整存储容量,当需要添加新元素时,会自动分配更多的内存空间。

            随机访问:可以通过下标或迭代器来访问元素,支持快速的随机访问。

            自动扩容:当元素个数超过当前容量时,std::vector会自动重新分配更大的内存块,以便容纳更多元素。

            连续存储:std::vector的元素在内存中是连续存储的,这样可以提高访问效率。

            支持动态调整大小:可以使用 push_back() 和 pop_back() 方法在尾部添加或删除元素,也可以使用 resize() 方法动态调整容器大小。

            与其它动态序列容器相比(deque, list and forward_list): vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好

            使用std::vector前需要包含头文件 ,例如:#include 。

            下面是一个使用std::vector的简单示例:

            #include 
            #include 
            int main() {
                std::vector vec; // 声明一个存储int类型的vector
                // 在vector中添加元素
                vec.push_back(10);
                vec.push_back(20);
                vec.push_back(30);
                // 遍历vector并输出元素
                for (const auto& element : vec) {
                    std::cout 
              //构造函数的使用顺序与上述相同:
              std::vector16,2,77,29};
              std::vector1, 2, 3, 4};
            std::vector5, 6, 7};
            vec1 = vec2; // 将 vec2 的内容赋值给 vec1
            
                std::vector1, 2, 3, 4, 5};
                // 使用 begin() 获取可修改迭代器
                std::vector
                    std::cout 
                std::vector1, 2, 3, 4, 5};
                // 使用 end() 获取可修改迭代器
                std::vector
                    std::cout 
                std::vector1, 2, 3, 4, 5};
                // 使用 rbegin() 获取可修改逆向迭代器
                std::vector
                    std::cout 
                std::vector 1, 2, 3, 4, 5 };
                // 使用 rend() 获取可修改逆向迭代器的结束位置
                std::vector
                    //*rit += 1; //错误:常量逆向迭代器不允许修改元素的值
                    std::cout 
                    *rit += 1;// 从后往前修改每一个元素的值
                    std::cout 
                std::vector1, 2, 3, 4, 5};
                // 使用 cbegin() 获取常量迭代器的开始位置
                std::vector
                    std::cout 
                    std::cout 
                std::vector1, 2, 3, 4, 5};
                std::cout 
                size_t sz;
                vector
                    v.push_back(i);
                    if (sz != v.capacity())
                    {
                        sz = v.capacity();
                        cout 
                TestVectorExpand();
                return 0;
            }
            
                vector
                    v.push_back(i);
                    if (sz != v.capacity())
                    {
                        sz = v.capacity();
                        cout 
                TestVectorExpandOP();
                return 0;
            }
            
                std::vector1, 2, 3, 4, 5};
                // 修改元素
                myVector[2] = 10; // 将索引 2 处的元素修改为 10
                // 读取元素
                std::cout 
                std::vector1, 2, 3, 4, 5};
                // 修改元素
                myVector.at(2) = 10; // 将索引 2 处的元素修改为 10
                // 读取元素
                std::cout 
                    int value = myVector.at(10);
                } catch (const std::out_of_range& e) {
                    std::cout 
                std::vector1, 2, 3, 4, 5};
                // 修改第一个元素
                myVector.front() = 10; // 将第一个元素修改为 10
                // 读取第一个元素
                std::cout 
                std::vector1, 2, 3, 4, 5};
                // 修改最后一个元素
                myVector.back() = 10; // 将最后一个元素修改为 10
                // 读取最后一个元素
                std::cout 
                std::vector1, 2, 3, 4, 5};
                // 获取底层存储数组的非常量指针
                int* ptr = myVector.data();
                // 修改底层存储数组
                ptr[0] = 10;
                ptr[3] = 20;
                // 通过 const value_type* 获取底层存储数组的常量指针(适用于 const std::vector)
                const std::vector
                    std::cout 
                std::vector10, 20, 30, 40, 50};
                myVector.assign(sourceVector.begin(), sourceVector.end());
                // 打印容器内容
                for (int num : myVector) {
                    std::cout 
                    std::cout 
                std::vector
                    std::cout 
                std::vector10, 20, 30};
                std::cout 
                    std::cout 
                    std::cout 
                std::vector1, 2, 3};
                std::vector
                    std::cout 
                std::vector1, 2, 3};
                std::vector
                    std::cout 
                std::vector1, 2, 3};
                std::vector100, 200};
                std::vector
                    std::cout 
                std::vector1, 2, 3, 4, 5};
                std::vector
                    std::cout 
                std::vector1, 2, 3, 4, 5};
                std::vector
                    std::cout 
                std::vector1, 2, 3};
                std::vector4, 5, 6};
                std::cout 
                    std::cout 
                    std::cout 
                    std::cout 
                    std::cout 
                std::vector1, 2, 3, 4, 5};
                std::cout 
                    std::cout 
                    std::cout 
            public:
                Person(const std::string& name, int age) : name_(name), age_(age) {
                    std::cout 
                std::vector
            public:
                Person(const std::string& name, int age) : name_(name), age_(age) {
                    std::cout 
                std::vector
            	vector 1,2,3,4,5,6 };
            	auto it = v.begin();
            	v.assign(100, 8);
            	
            	while (it != v.end())
            	{
            		cout 
            	int a[] = { 1, 2, 3, 4 };
            	vector
            	vector 1, 2, 3, 4 };
            	auto it = v.begin();
            	while (it != v.end())
            	{
            		if (*it % 2 == 0)
            			v.erase(it);
            		++it;
            	}
            	return 0;
            }
            
            	vector 1, 2, 3, 4 };
            	auto it = v.begin();
            	while (it != v.end())
            	{
            		if (*it % 2 == 0)
            			it = v.erase(it);
            		else
            			++it;
            	}
            	return 0;
            }
            
            	vector 1,2,3,4,5 };
            	for (size_t i = 0; i 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]