当前位置: 首页 > news >正文

C++STL容器vector容器大小相关函数

目录

前言

主要参考

vector::size

vector::max_size

vector::resize

vector::capacity

vector::empty

vector::reserve

vector::shrink_to_fit

共勉


前言

        本文将讨论STL容器vector中与迭代器相关的函数,模板参数T为int类型。

主要参考

        cpluscplus.com

        侯捷《STL源码剖析》

        通义

vector::size

size_type size();

参数:

返回值: 返回vector中的元素数量, 返回一个无符号整型

功能: 

  • 返回vector中的元素数量。
  • 这是vector中实际持有的对象数量,这并不一定等于其存储容量。

案例

#include <iostream>
#include <vector>int main()
{std::cout << std::endl;std::vector<int> myints;std::cout << "0. size: " << myints.size() << '\n';// 向向量中添加 10 个元素,从 0 到 9for (int i = 0; i < 10; i++){myints.push_back(i);}std::cout << "1. size: " << myints.size() << '\n';// 在向量末尾插入 10 个值为 100 的元素myints.insert(myints.end(), 10, 100);std::cout << "2. size: " << myints.size() << '\n';// 移除向量的最后一个元素myints.pop_back();std::cout << "3. size: " << myints.size() << '\n';std::cout << std::endl;std::cout << std::endl;return 0;
}

运行结果

vector::max_size

size_type max_size();

参数:

返回值: vector可以包含的最大的元素数. (返回一个无符号整型)

功能: 

  • 返回向量可以容纳的最大元素数。
  • 这是由于已知系统或库实现限制而达到的容器的最大潜在大小,但容器绝不是保证能够达到该大小:在到达该大小之前仍有可能无法分配存储。

案例

#include <iostream>
#include <vector>int main()
{std::cout << std::endl;std::vector<int> myvector;// set some content in the vector:for (int i = 0; i < 100; i++)myvector.push_back(i);std::cout << "size: " << myvector.size() << "\n";std::cout << "max_size: " << myvector.max_size() << "\n";std::cout << std::endl;return 0;
}

运行结果

vector::resize

void resize (size_type n)

void resize (size_type n, const value_type& val)

参数:

  • n为新容器的大小, 以元素数量表示. 一个无符号整型
  • val如果n大于当前容器大小,对象的内容被复制到添加的元素中。如果没有指定,则使用默认构造函数代替。

返回值: 无返回值

功能: 

  • 将容器调整可以包含n个元素的大小。
  • 如果n小于当前容器大小,则内容减少到其前n个元素,删除超出的(并销毁它们)。
  • 如果n大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,直到达到n的大小。
  • 如果val指定,则新元素作为val的副本初始化,否则,它们被值初始化。
  • 如果n也大于当前容器容量,则自动重新分配已分配存储空间。请注意,此函数通过从容器中插入或删除元素而更改实际的内容。

案例

#include <iostream>
#include <vector>int main()
{std::cout << '\n';std::vector<int> myvector;// set some initial content:for (int i = 1; i < 10; i++){myvector.push_back(i);}std::cout << "myvector中初始内容: ";for (int i = 0; i < myvector.size(); i++){std::cout << ' ' << myvector[i];}std::cout << '\n';std::cout << '\n';myvector.resize(5);std::cout << "将myvector大小设置为5时: ";for (int i = 0; i < myvector.size(); i++){std::cout << ' ' << myvector[i];}std::cout << '\n';std::cout << '\n';myvector.resize(8, 100);std::cout << "将myvector大小设置为8, 并将大于原本空间的位置设置为100时: ";for (int i = 0; i < myvector.size(); i++){std::cout << ' ' << myvector[i];}std::cout << '\n';std::cout << '\n';myvector.resize(12);std::cout << "将myvector大小扩大为12时: ";for (int i = 0; i < myvector.size(); i++){std::cout << ' ' << myvector[i];}std::cout << '\n';std::cout << '\n';return 0;
}

运行结果

vector::capacity

size_type capacity();

参数:

返回值: 

        向量中当前分配的存储容量大小,以它能容纳的元素个数为单位。 (返回一个无符号整型)

功能: 

  • 返回为向量分配的存储空间大小,以元素为单位表示。
  • 此容量不一定等于向量大小。它可以相等或更大,并且额外的空间允许在插入时无需重新分配即可容纳增长。
  • 请注意,该容量并不意味着对向量大小的限制。当此容量用尽并且需要更多时,
  • 容器会自动扩展(重新分配其存储空间)。向量的最大尺寸由成员max_size给出理论上的上限。

案例

#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector;// 向myvector中插入5个元素:for (int i=0; i<5; i++) myvector.push_back(i);std::cout << "size: " << (int) myvector.size() << '\n';std::cout << "capacity: " << (int) myvector.capacity() << '\n';return 0;
}

运行结果

        这里可以看出当前myvector对象的大小是小于容器大小的, 因为容器在自动扩容的时候, 为了预防频繁多次扩容, 会一次性扩容较大的值, 不同的环境扩容大小可能会不一样. 所以capacity的值可能会有变化.

vector::empty

bool empty();

参数:
返回值: 如果容器大小为零,则为真,否则为假。(返回一个bool值)

功能: 测试向量是否为空
案例

#include <iostream>
#include <vector>int main()
{std::cout << '\n';std::vector<int> myvector;int sum(0);for (int i = 1; i <= 10; i++)myvector.push_back(i);// 当myvector容器为空的时候跳出循环while (!myvector.empty()){sum += myvector.back();myvector.pop_back();}std::cout << "total: " << sum << '\n';std::cout << '\n';return 0;
}

运行结果

        该示例将myvector的内容初始化为数字序列(从1到10)。然后逐个弹出元素,直到为空,并计算其和。

vector::reserve

void reserve (size_type n);

参数:

        n为向量的最小容量。 结果向量的容量可能等于或大于n。

        size_type是一个无符号整数类型。

返回值: 无返回值

功能: 

  • 请求更改容量 要求向量容量至少足以包含n个元素。
  • 如果n大于当前vector容量,该函数将容器重新分配其存储并增加其vector到n(或更大)。在所有其他情况下,函数调用不会导致重新分配,并且vector容量不受影响。 此功能对vector大小没有影响,也不能改变其元素。

案例

#include <iostream>
#include <vector>int main()
{std::cout << '\n';std::vector<int>::size_type sz;std::vector<int> v1;sz = v1.capacity();std::cout << "让v1扩容:\n";for (int i = 0; i < 100; ++i){v1.push_back(i);if (sz != v1.capacity()){sz = v1.capacity();std::cout << "capacity 改变: " << sz << '\n';}}std::vector<int> v2;sz = v2.capacity();v2.reserve(100); // this is the only difference with v1 abovestd::cout << "让v2扩容:\n";for (int i = 0; i < 100; ++i){v2.push_back(i);if (sz != v2.capacity()){sz = v2.capacity();std::cout << "capacity 改变: " << sz << '\n';}}std::cout << '\n';return 0;
}

运行结果

vector::shrink_to_fit

void shrink_to_fit();

参数: 

返回值:

功能:

        将容器容量缩小到合适大小,这可能会导致重新分配,但不会影响容器内容大小,并且不能更改其元素。

案例:

int main()
{std::cout << '\n';std::vector<int> myvector(100);std::cout << "容器初始容量大小: " << myvector.capacity() << '\n';std::cout << "容器初始大小: " << myvector.size() << '\n';std::cout << '\n';myvector.resize(10);std::cout << "重新设置后的容量大小: " << myvector.capacity() << '\n';std::cout << "重新设置后的容器大小: " << myvector.size() << '\n';std::cout << '\n';myvector.shrink_to_fit();std::cout << "调整之后的容器容量大小" << myvector.capacity() << '\n';std::cout << "调整后的容器大小: " << myvector.size() << '\n';std::cout << '\n';return 0;
}

运行结果

共勉

        希望本文能给你带来帮助,如果有什么问题或疑问欢迎评论区和私信讨论。谢谢点赞、收藏、关注。

感谢阅读

http://www.lryc.cn/news/499179.html

相关文章:

  • 阿里云CPU超载解决记录
  • 【工具变量】上市公司企业商业信用融资数据(2003-2022年)
  • 2024数字科技生态大会 | 紫光展锐携手中国电信助力数字科技高质量发展
  • ES语法(一)概括
  • (vue)el-cascader多选级联选择器,值取最后一级的数据
  • 友思特方案 | 精密制程的光影贴合:半导体制造中的高功率紫外光源
  • README写作技巧
  • 【密码学】分组密码的工作模式
  • SQL 和 NoSQL 有什么区别?
  • 提升网站流量的关键:AI在SEO关键词优化中的应用
  • Harnessing Large Language Models for Training-free Video Anomaly Detection
  • 如何通过自学成长为一名后端开发工程师?
  • HDR视频技术之六:色调映射
  • (洛谷题目)P11060 【MX-X4-T0】「Jason-1」x!
  • TEXT2SQL工具vanna本地化安装和应用
  • Bloom 效果
  • AWS 机器学习,推动 AI 技术的健康发展
  • MCPTT 与BTC
  • Jackson - JsonGenerator创建JSON、JsonParser解析JSON
  • Linux-音频应用编程
  • 《QT 示例宝库:探索丰富的编程世界》
  • 腾讯云流式湖仓统一存储实践
  • 18 设计模式之迭代器模式(书籍遍历案例)
  • 超清4K视频素材哪里找?优质下载资源网站分享
  • 刷题日志【1】
  • 【C++算法】32.前缀和_矩阵区域和
  • 使用堆栈(Stack)
  • 雨晨 2610(2)0.2510 Windows 11 24H2 Iot 企业版 LTSC 2024 极简 2in1
  • HDD 2025年技术趋势深度分析报告
  • 算法-字符串-22.括号生成