网站域名备案证明,浏览器2345网址导航下载安装,胶南做网站,商业网站建设规划范文一.vector的基本概念 vector是C标准库中的一种动态数组容器#xff0c;提供了动态大小的数组功能#xff0c;能够在运行时根据需要自动扩展和收缩。vector以连续的内存块存储元素#xff0c;可以快速访问和修改任意位置的元素。 以下是vector的基本概念和特点#xff1a; 动…
一.vector的基本概念 vector是C标准库中的一种动态数组容器提供了动态大小的数组功能能够在运行时根据需要自动扩展和收缩。vector以连续的内存块存储元素可以快速访问和修改任意位置的元素。 以下是vector的基本概念和特点 动态大小vector可以动态地调整其大小可以在运行时根据需要添加或删除元素。与静态数组不同vector不需要在定义时指定固定的元素个数。 连续存储vector以连续的内存块存储元素。这样的存储方式使得访问元素变得高效可以通过索引快速访问和修改任意位置的元素。 自动扩展和收缩vector可以根据需要自动扩展以容纳更多的元素并在需要时自动收缩以节省内存。这样您无需手动管理内存vector会自动处理。 插入和删除vector提供了多种方法来插入和删除元素。可以在任意位置插入元素也可以从任意位置删除元素包括头部和尾部。 随机访问vector支持快速的随机访问。可以使用索引来直接访问任意位置的元素时间复杂度为O(1)。 迭代器支持vector提供迭代器来遍历容器中的元素。迭代器可以用于读取和修改容器中的元素支持正向和反向迭代。 vector是一个非常常用和灵活的容器适用于需要动态调整大小的数组存储需求。它在许多应用中都很有用例如数据的动态收集、动态分配的数组、实现栈和队列等。 功能 vector教据结构和数组非常相似也称为单端数组 vector与普通数组的区别 不同之处在于数组是静态空间而vector可以动态扩展 动态扩展 并不是在原空间之后续接新空间而是找更大的内存空间然后将原数据拷贝新空间释放原空间 二.vector赋值操作
vector提供了几种不同的函数和操作符用于赋值操作。以下是常用的vector赋值操作的函数原型
operator 操作符
vector operator(const vector other);该操作符用于将一个vector赋值给另一个vector使它们包含相同的元素。该操作符返回一个引用允许连续赋值。
assign() 函数
void assign(size_type count, const T value);
templatetypename InputIt
void assign(InputIt first, InputIt last);
void assign(std::initializer_listT ilist);assign() 函数用于将指定的值、范围或初始化列表中的元素赋值给vector。第一个版本接受指定数量的元素值第二个版本接受范围指针可以使用迭代器指定范围第三个版本接受一个初始化列表。
swap() 函数
void swap(vector other);swap() 函数用于交换两个vector的内容将当前vector与另一个vector的元素进行交换。
整理成表格以方便查阅。
函数函数原型描述operatorvector operator(const vector other);将一个vector赋值给另一个vector使它们包含相同的元素。assign()void assign(size_type count, const T value);将指定数量的元素值赋值给vector。templatetypename InputIt void assign(InputIt first, InputIt last);将范围指针指定的元素赋值给vector。void assign(std::initializer_listT ilist);将初始化列表中的元素赋值给vector。swap()void swap(vector other);交换两个vector的内容。
三.vextor的大小和容量
vector提供了一些函数用于获取容量和大小相关的信息。以下是vector的容量和大小函数的原型
size() 函数
size_type size() const;此函数返回vector当前包含的元素数量也就是vector的大小。
max_size() 函数
size_type max_size() const;该函数返回vector可以容纳的最大元素数量考虑到系统限制和内存限制。
resize() 函数
void resize(size_type count);
void resize(size_type count, const T value);此函数用于调整vector的大小可以增加或减少元素的数量。第一个版本将vector的大小调整为指定的 count第二个版本还可以指定当扩展vector大小时默认填充的元素值。
capacity() 函数
size_type capacity() const;该函数返回当前vector的容量即能够在重新分配内存之前持有的元素数量以节省内存重新分配的开销。
reserve() 函数
void reserve(size_type new_cap);此函数用于增加vector的容量使其至少能够容纳指定数量的元素但不为元素分配实际值。这可以提前分配所需的内存以减少因调整大小而引起的内存重新分配的次数。
整理成表格
函数函数原型描述size()size_type size() const;返回vector当前包含的元素数量即vector的大小。max_size()size_type max_size() const;返回vector可以容纳的最大元素数量受系统限制和内存限制约束。empty()bool empty() const;判断vector是否为空若为空则返回true否则返回false。resize()void resize(size_type count);void resize(size_type count, const T value);调整vector的大小增加或减少元素数量。第一个版本将vector的大小调整为指定的count。第二个版本在扩展vector大小时指定默认的填充元素值。capacity()size_type capacity() const;返回当前vector的容量即为元素重新分配内存之前可以容纳的元素数量以节省内存重新分配的开销。reserve()void reserve(size_type new_cap);增加vector的容量使其至少能够容纳指定数量的元素但不为元素分配实际值。这样可以减少内存重新分配的次数。
四.vector插入和删除
整理成表格
函数函数原型描述insert()iterator insert(iterator pos, const T value);iterator insert(iterator pos, size_type count, const T value);在指定位置插入元素到vector中并返回插入的位置迭代器。第一个版本可以插入单个元素。第二个版本可以插入指定数量的相同元素。emplace()template class... Args iterator emplace(iterator pos, Args... args);在指定位置就地构造一个元素并返回插入的位置迭代器。erase()iterator erase(iterator pos);iterator erase(iterator first, iterator last);从vector中删除指定位置或范围的元素并返回下一个元素的位置迭代器。clear()void clear();从vector中移除所有的元素使其变为空。push_back()void push_back(const T value);将元素添加到vector的末尾。emplace_back()template class... Args reference emplace_back(Args... args);在vector的末尾就地构造一个元素。pop_back()void pop_back();移除vector的最后一个元素。
请注意表中的函数参数使用的是迭代器iterator而非常数迭代器const_iterator。这是因为插入和删除操作会改变容器的内容所以需要可变的迭代器来指向和修改元素。
五.vector数据的存取
下面是vector的数据存取操作函数的函数原型整理成表格
函数函数原型描述at()reference at(size_type pos);const_reference at(size_type pos) const;返回指定位置的元素的引用。若pos超出范围会抛出out_of_range异常。operator[]()reference operator[](size_type pos);const_reference operator[](size_type pos) const;返回指定位置的元素的引用。不进行范围检查使用时需确保索引有效。front()reference front();const_reference front() const;返回vector中第一个元素的引用。back()reference back();const_reference back() const;返回vector中最后一个元素的引用。data()T* data();const T* data() const;返回指向vector中第一个元素的指针。若vector为空返回空指针。
以上是常用的vector数据存取操作的函数原型。您可以根据需要使用它们来访问和修改vector中的元素。
六.vector的容器交换
vector的容器互换操作可以使用swap()函数来实现。swap()函数可以交换两个容器的内容具体的函数原型如下
template class T, class Alloc
void swap(vectorT,Alloc x, vectorT,Alloc y) noexcept;其中x和y是要互换内容的两个 vector 容器。使用swap()函数可以快速高效地交换两个 vector 的内容而不需要逐个元素进行复制或移动。
下面是一个简单的示例演示如何使用 swap() 函数交换两个 vector 的内容
#include iostream
#include vectorint main() {std::vectorint vec1 {1, 2, 3, 4};std::vectorint vec2 {5, 6, 7, 8};// 输出交换前的内容std::cout vec1: ;for (const auto num : vec1) {std::cout num ;}std::cout std::endl;std::cout vec2: ;for (const auto num : vec2) {std::cout num ;}std::cout std::endl;// 交换容器内容std::swap(vec1, vec2);// 输出交换后的内容std::cout vec1: ;for (const auto num : vec1) {std::cout num ;}std::cout std::endl;std::cout vec2: ;for (const auto num : vec2) {std::cout num ;}std::cout std::endl;return 0;
}运行以上代码将会输出如下结果
vec1: 1 2 3 4
vec2: 5 6 7 8
vec1: 5 6 7 8
vec2: 1 2 3 4通过 swap() 函数vec1 和 vec2 的内容被互换了。这个操作非常高效因为只涉及到指针的交换而不需要逐个元素进行复制或移动。
巧用swap收缩内存空间
swap()函数还可以用于收缩vector内存空间从而释放不需要的内存。通过将一个空的vector与目标vector进行交换可以使目标vector的容量缩小到与其当前大小相匹配。
这是因为当swap()函数交换两个vector时目标vector会获得另一个vector的内存空间而那个被交换的vector则会获得一个空的内存空间。然后由于交换后的vector大小与容量相匹配多余的内存会被释放。
以下是一个示例代码展示了如何通过swap()函数收缩vector的内存空间
#include iostream
#include vectorint main() {std::vectorint vec;// 向vector中添加大量数据for (int i 0; i 1000000; i) {vec.push_back(i);}std::cout Size before shrink: vec.size() std::endl;std::cout Capacity before shrink: vec.capacity() std::endl;// 收缩内存空间std::vectorint(vec).swap(vec);std::cout Size after shrink: vec.size() std::endl;std::cout Capacity after shrink: vec.capacity() std::endl;return 0;
}运行以上代码将会输出如下结果
Size before shrink: 1000000
Capacity before shrink: 1048576
Size after shrink: 1000000
Capacity after shrink: 1000000通过使用swap()函数将一个空的vector和目标vector交换我们成功缩小了vec的内存空间使其容量与其大小相匹配。注意swap()函数的参数是通过使用临时vector构造的以避免影响到原始vec的值。
请注意这种技巧并不适用于C11标准之前的版本因为在C11之前vector的移动语义不是必须的而可能导致复制操作而不是交换操作。因此在使用旧标准的编译器中最好使用shrink_to_fit()函数来请求收缩内存这是C11引入的函数并作为标准函数来直接缩小容器的内存空间。 七.函数接口总结
以下是一些对std::vector的扩展函数和成员类型
函数或成员类型描述std::vector::emplace_hint在指定位置的提示前插入元素std::vector::insert_or_assign插入元素或修改现有元素的值std::vector::erase移除指定位置或指定范围的元素std::vector::erase_if根据给定的谓词函数删除元素std::vector::remove移除指定值的所有元素std::vector::remove_if根据给定的谓词函数删除元素std::vector::swap交换两个向量的内容std::vector::merge合并两个已排序的向量并将结果存储在第一个向量中std::vector::sort对向量的元素进行排序std::vector::stable_sort对向量的元素进行稳定排序std::vector::reverse反转向量中元素的顺序std::vector::unique移除重复的元素仅保留相邻的一个std::vector::unique根据给定的谓词函数移除重复的元素std::vector::binary_search使用二分查找在排序的向量中查找元素std::vector::lower_bound返回一个迭代器指向在已排序向量中首次出现不小于给定值的元素位置std::vector::upper_bound返回一个迭代器指向在已排序向量中首次出现大于给定值的元素位置std::vector::equal_range返回一个pair其中第一个迭代器是lower_bound返回值第二个迭代器是upper_bound返回值std::vector::rbegin返回指向最后一个元素的反向迭代器std::vector::rend返回指向第一个元素之前位置的反向迭代器std::vector::cbegin返回指向第一个元素的常量迭代器std::vector::cend返回指向最后一个元素之后位置的常量迭代器std::vector::crbegin返回指向最后一个元素的反向常量迭代器std::vector::crend返回指向第一个元素之前位置的反向常量迭代器std::vector::max_size返回向量能容纳的最大元素数量std::vector::reserve提前预留指定的容量以减少重新分配内存的次数std::vector::emplace_hint在指定位置的提示前插入元素std::vector::insert_or_assign插入元素或修改现有元素的值std::vector::get_allocator返回与向量关联的内存分配器std::vector::operator判断两个向量是否相等std::vector::operator!判断两个向量是否不相等std::vector::operator比较两个向量的字典序std::vector::operator判断一个向量是否小于等于另一个向量std::vector::operator判断一个向量是否大于另一个向量std::vector::operator判断一个向量是否大于等于另一个向量std::vector::emplace_hint在指定位置的提示前插入元素std::vector::insert_or_assign插入元素或修改现有元素的值std::vector::erase移除指定位置或指定范围的元素std::vector::erase_if根据给定的谓词函数删除元素std::vector::remove移除指定值的所有元素std::vector::remove_if根据给定的谓词函数删除元素std::vector::swap交换两个向量的内容std::vector::merge合并两个已排序的向量并将结果存储在第一个向量中std::vector::sort对向量的元素进行排序std::vector::stable_sort对向量的元素进行稳定排序std::vector::reverse反转向量中元素的顺序std::vector::unique移除重复的元素仅保留相邻的一个std::vector::unique根据给定的谓词函数移除重复的元素std::vector::binary_search使用二分查找在排序的向量中查找元素std::vector::lower_bound返回一个迭代器指向在已排序向量中首次出现不小于给定值的元素位置std::vector::upper_bound返回一个迭代器指向在已排序向量中首次出现大于给定值的元素位置std::vector::equal_range返回一个pair其中第一个迭代器是lower_bound返回值第二个迭代器是upper_bound返回值