C++ 学习之vector容器

简介: C++ 学习之vector容器

C++ vector容器构造函数

C++中,vector容器有多个构造函数可供使用。以下是常用的几种构造函数:

  1. 默认构造函数:
vector<T> vec;
  1. 创建一个空的vector容器,其中T为元素的类型。
  2. 带有初始元素个数的构造函数:
vector<T> vec(size);
  1. 创建一个包含指定数量(size)个默认构造的元素的vector容器。
  2. 使用相同值初始化所有元素的构造函数:
vector<T> vec(size, value);
  1. 创建一个包含指定个数(size)个值为value的元素的vector容器。
  2. 利用迭代器范围构造函数:
vector<T> vec(first, last);
  1. 创建一个包含[first, last)范围内元素的vector容器。其中,first和last是迭代器,指向某个序列(比如数组)中的元素。
  2. 拷贝构造函数:
vector<T> vec(otherVec);
  1. 创建一个与另一个已存在的vector容器(otherVec)完全相同的副本。

这些构造函数提供了不同的方式来创建并初始化一个vector容器。根据需要选择合适的构造函数来构造vector对象。

C++ vector容器赋值操作

在C++中,vector容器支持多种赋值操作,以下是常用的几种赋值方式:

  1. 使用赋值操作符(=)对整个vector进行赋值:
vector<T> vec1 = {1, 2, 3, 4, 5};
vector<T> vec2;
vec2 = vec1;
  1. 上述代码将vec1的所有元素赋值给vec2,两个vector容器中的元素完全相同。
  2. 使用assign()函数赋值:
vector<T> vec3;
vec3.assign(5, 10);
  1. 上述代码将vec3的元素全部替换为5个值为10的元素。
  2. 使用迭代器和区间进行赋值:
vector<T> vec4 = {1, 2, 3, 4, 5};
vector<T> vec5;
vec5.assign(vec4.begin(), vec4.end());
  1. 上述代码使用vec4的begin和end迭代器指定的范围来给vec5赋值,vec5将和vec4的内容一致。
  2. 使用swap函数交换两个vector的内容:
vector<T> vec6 = {1, 2, 3};
vector<T> vec7 = {4, 5, 6};
vec6.swap(vec7);
  1. 上述代码将vec6和vec7的内容进行交换,最终vec6中的元素变为{4, 5, 6},vec7中的元素变为{1, 2, 3}。

C++ vector容器容量和大小

在C++中,vector容器提供了容量(capacity)和大小(size)两个成员函数来描述容器的状态。

  1. 容量(capacity)指的是vector容器在重新分配内存之前可以容纳的元素数量。vector容器会自动管理内存,并在需要时动态分配更多的空间来存储元素。
  • 使用capacity()函数可以获取当前vector容器的容量:
vector<T> vec;
int capacity = vec.capacity();
  • 如果想要改变vector容器的容量,可以使用reserve()函数或者resize()函数:
  • reserve()函数用于预留空间,但并不改变vector容器的大小。
vector<T> vec;
vec.reserve(10);  // 预留10个元素的空间
  • resize()函数用于改变vector容器的大小,并可选地指定默认值。
vector<T> vec;
vec.resize(5);          // 改变为5个元素的大小,默认值为元素类型的默认构造函数的值
vec.resize(10, value);  // 改变为10个元素的大小,并使用指定的value做为默认值
  1. 大小(size)指的是vector容器中当前实际包含的元素数量。
  • 使用size()函数可以获取vector容器的当前大小:
vector<T> vec;
int size = vec.size();
  • 可以通过向vector容器中添加或删除元素来改变其大小:
  • 使用push_back()函数将一个元素添加到vector容器的尾部:
vector<T> vec;
vec.push_back(value);
  • 使用pop_back()函数移除vector容器尾部的元素:
vector<T> vec;
vec.pop_back();
  • 使用resize()函数也可以改变vector容器的大小,详见上述容量的第二点。

总而言之,容量表示vector容器可以容纳的元素数量,大小表示vector容器当前实际包含的元素数量。可以通过成员函数和相应的操作来获取和改变容量和大小。

C++ vector容器插入和删除

在C++中,vector容器提供了多种方法来插入和删除元素。以下是常用的插入和删除操作:

  1. 插入元素:
  • 在指定位置插入单个元素:
vector<T> vec = {1, 2, 3, 4, 5};
auto it = vec.begin() + 2;  // 指向第三个位置
vec.insert(it, 10);  // 在第三个位置前插入元素10
  • 在指定位置插入多个元素:
vec.insert(it, 3, 10);  // 在第三个位置前插入3个值为10的元素
  • 在指定位置插入另一个vector的元素:
vector<T> anotherVec = {6, 7, 8};
vec.insert(vec.begin() + 2, anotherVec.begin(), anotherVec.end());  // 在第三个位置前插入anotherVec的所有元素
  • 在末尾插入元素:
vec.push_back(20);  // 在末尾添加元素20
  1. 删除元素:
  • 删除指定位置的元素:
vec.erase(vec.begin() + 2);  // 删除第三个位置的元素
  • 删除指定范围的元素:
vec.erase(vec.begin() + 2, vec.begin() + 5);  // 删除第三个到第五个位置之间的元素
  • 删除末尾元素:
vec.pop_back();  // 删除末尾元素
  • 清空整个vector:
vec.clear();  // 清空所有元素

C++ vector容器数据存取

在C++中,vector容器提供了多种方式来进行数据的存取操作。以下是常用的方法:

  1. 通过下标访问元素:
vector<int> vec = {1, 2, 3, 4, 5};
int element = vec[2]; // 访问第三个元素,下标从0开始
  1. 使用at()函数进行安全的访问元素(会进行越界检查):
int element = vec.at(2); // 访问第三个元素
  1. 使用迭代器访问元素:
vector<int>::iterator it = vec.begin(); // 指向第一个元素
int firstElement = *it; // 获取第一个元素的值
  1. 使用for循环遍历所有元素:
for(int i = 0; i < vec.size(); i++) {
    cout << vec[i] << " "; // 输出每个元素
}
  1. 使用范围-based for 循环(C++11及以上版本):
for(int num : vec) {
    cout << num << " "; // 输出每个元素
}
  1. 获取首尾元素:
int firstElement = vec.front(); // 获取首元素的值
int lastElement = vec.back(); // 获取末尾元素的值

C++ vector容器互换容器

在C++中,可以使用std::swap()函数来交换两个vector容器的内容。swap函数会交换两个容器中的元素,而不会复制整个容器。

下面是使用std::swap()函数交换两个vector容器的示例代码:

#include <iostream>
#include <vector>
int main() {
    std::vector<int> vec1 = {1, 2, 3};
    std::vector<int> vec2 = {4, 5, 6};
    
    std::cout << "vec1: ";
    for (int num : vec1) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    std::cout << "vec2: ";
    for (int num : vec2) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    std::swap(vec1, vec2); // 交换vec1和vec2的内容
    
    std::cout << "After swap:" << std::endl;
    
    std::cout << "vec1: ";
    for (int num : vec1) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    std::cout << "vec2: ";
    for (int num : vec2) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

输出结果:

vec1: 1 2 3
vec2: 4 5 6
After swap:
vec1: 4 5 6
vec2: 1 2 3

通过使用std::swap()函数,vec1和vec2的内容被互换了。注意,std::swap()函数是一个标准库函数,需要包含头文件来使用。这样可以高效地交换两个vector容器的内容。

C++ vector容器预留空间

在C++中,可以使用vector容器的reserve()函数来预留存储空间,以提前为容器分配一定大小的内存,从而提高程序的性能。预留空间后,当向vector容器添加元素时,不会频繁地重新分配内存,从而减少了内存分配和拷贝的开销。

下面是使用reserve()函数预留vector容器空间的示例代码:

#include <iostream>
#include <vector>
int main() {
    std::vector<int> vec;
    
    std::cout << "Capacity before reserve: " << vec.capacity() << std::endl;
    
    vec.reserve(100); // 预留至少能容纳100个元素的空间
    
    std::cout << "Capacity after reserve: " << vec.capacity() << std::endl;
    
    return 0;
}

运行上述示例代码,输出结果类似如下:

Capacity before reserve: 0
Capacity after reserve: 100

在这个示例中,通过调用vec.reserve(100)函数,使得vector容器vec的容量调整为至少能容纳100个元素的大小。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

相关文章
|
3天前
|
存储 C语言 C++
【C++】vector的使用上
**C++ STL的vector简介与用法:** Vector是动态顺序数组,提供高效下标访问,支持动态增长。与数组类似但可自动调整大小。常用构造函数包括默认、填充、迭代器范围和拷贝构造。析构函数自动释放内存。赋值运算符执行深拷贝。迭代器接口包括`begin()`和`end()`(反向对应`rbegin()`和`rend()`),C++11增加了const版本以支持只读访问。示例代码展示了不同构造函数和迭代器的使用。
|
2天前
|
安全 Java 容器
第一篇:并发容器学习开篇介绍
第一篇:并发容器学习开篇介绍
11 4
|
3天前
|
编译器 C++
【C++】vector的使用下
**C++ 中的 `std::vector` 概要:** - **元素获取:** 支持 `operator[]`(越界时不检
|
3天前
|
C++
C++基础知识(四:类的学习)
类指的就是对同一类对象,把所有的属性都封装起来,你也可以把类看成一个高级版的结构体。
|
3天前
|
算法 C++ 容器
|
3天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
3天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
3天前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。