不要轻易定义指向std::vector中的元素的指针

这篇具有很好参考价值的文章主要介绍了不要轻易定义指向std::vector中的元素的指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

类应该是被封装的,类的用户通过接口使用类提供的功能,而不必关心类的内部如何实现。然而,C++标准库容器 std::vector 的实现渗透到了接口中来。对于以下代码:

    const int pushNum = 10;
    std::vector<int> v = { 1,2,3 };
    int* p = &v[1];
    std::cout << "*p = " << * p << std::endl;
    std::cout << "v[1] = " << v[1] << std::endl;
for (int i = 0; i < pushNum; i++) v.push_back(i); std::cout << "---------------------" << std::endl;
std::cout
<< "*p = " << *p << std::endl; std::cout << "v[1] = " << v[1] << std::endl;

我们初始化了一个有3个int元素的vector,定义了一个int 指针p,指向v[1] , 打印 *p 以及v[1] 的值。 然后向 v 中push_back() 了10 个元素,之后再次打印 *p 以及 v[1] 的值。在作者的环境中,程序的运行结果如下:

不要轻易定义指向std::vector中的元素的指针

 

 可以看到,在最初的v 中,打印出的*p 以及 v[1] 的值都是2, 这正是容器中下标为 1 的元素的值。 而push_back() 一些元素之后,v[1] 仍然是2,但是*p 的值却变了。指针p指向的就是v[1] ,为什么会这样呢?原因要追溯到标准库std::vector的实现。

std::vector 对象动态管理内存空间,一个std::vector 对象所分配的所有内存空间未必都构造了元素。可以使用其成员函数size() 返回其已构造的元素数量, 使用capacity() 返回其已分配的总容量,即,已分配的内存一共可以构造多少个元素。随着我们不断push_back(),size 会逐渐增加,直到capacity没有足够的空间能够容下下一个元素,这时,std::vector就会分配更多的内存。然而,std::vector 要求元素是连续存储的,如果此时连续的内存已经没有更多的空间了,std::vector会把所有元素搬到一块其他的,更大的内存空间,来容纳更多元素,并且其内部实现会保证其重载的下标访问运算符 [ ] 是有效的,然而std::vector 无法得知此时有一个指针p指向了容器内的元素,所以无法更新指针,而指针所指向的旧的内存现在是未知的。

那么std::vector 每次重新分配的时候会申请多大的空间作为capacity() ? 作者在自己的环境中做了一些实验,但并没有发现什么规律。文章来源地址https://www.toymoban.com/news/detail-747179.html

到了这里,关于不要轻易定义指向std::vector中的元素的指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】多态 ⑧ ( 验证指向 虚函数表 的 vptr 指针 | 对比定义了虚函数的类和没有定义虚函数类的大小 )

    对比 定义了 虚函数 的类 与 没有定义虚函数的类 的大小 , 其它成员都相同 , 定义了虚函数的类多出了 4 字节 , 多出的 4 字节就是 vptr 指针占用的内存空间 ; \\\" 虚函数表 \\\" 由 C++ 编译器 负责 创建 与 维护 , 被 virtual 修饰的 虚函数 , 会自动 被 C++ 编译器 存储到 \\\" 虚函数

    2024年02月06日
    浏览(27)
  • C++11补充:智能指针如std::unique_ptr如何添加自定义的deleter

    关于智能指针的问题,有时候为了方便,需要在析构时附加一些清理操作,或者,有的指针本身来自C的库文件中,这时候,就非常期望能够使用自定义的deleter, 但是标准C++创建函数如std::make_unique / std::make_shared 等不支持创建带有自定义deleter的智能指针,这时,我们只能使用

    2024年02月07日
    浏览(33)
  • python(8):使用conda update更新conda后,anaconda所有环境崩溃----问题没有解决,不要轻易更新conda

    (1) 不要轻易使用 conda update 更新 conda ----我遇到了解决不了的问题 python (2) 使用 python 时一定要用工具,如 anaconda 等,管理自己创建的虚拟环境,不要让自己创建的环境污染系统的base环境,不然就需要重新安装系统了----我这里目前最好的解决方案是删除并重装 anaconda (系统的

    2024年02月03日
    浏览(53)
  • C语言指针操作(六)指向函数的指针

    指向函数的指针详解,以及如何使用指向函数的指针变量做函数参数 指向函数的指针作为函数参数,是 C 语言实际应用中的一个比较深入的部分。 目录 一、什么是函数的指针 二、用函数指着变量调用函数 2.1举例说明 三、怎样定义和使用指向函数的指针变量 3.1定义指向函数

    2024年02月05日
    浏览(40)
  • C++的std::vector

    std::vector 是C++标准库中的一个 序列容器 ,它 封装了动态大小数组的行为 。 std::vector 允许你在运行时 动态地添加和删除元素 ,自动管理存储空间的分配和释放。由于其灵活性和易用性, std::vector 在C++程序中被广泛使用,特别是在需要存储一系列元素时。 动态大小:std::v

    2024年02月21日
    浏览(23)
  • 算法:移除数组中的val的所有元素---双指针[2]

    文章来源: https://blog.csdn.net/weixin_45630258/article/details/132689237 欢迎各位大佬指点、三连 1、题目: 给你一个数组 nums和一个值 val,你需要 原地移除 所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地修改 输入

    2024年02月09日
    浏览(34)
  • 【C/C++】 常量指针,指针常量、指向常量的常指针详解

    指针就是指向变量在内存中的地址 数据是存放在内存中的,每一个变量都有一个内存地址,假设是一个int类型变量 a ,占4个字节的内存区,那么在内存中如果是小端方式存储,我们创建指针p,把a的地址赋值给 p ,就是把a的首地址0x1100赋值给指针 p ,这个时候p的值就是变量

    2024年02月13日
    浏览(32)
  • C++面试八股文:std::vector和std::list,如何选择?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第24面: 面试官: list 用过吗? 二师兄:嗯,用过。 面试官:请讲一下 list 的实现原理。 二师兄: std::list 被称为双向链表,和C中手写双向链表本质上没有大的区别。 list 对象中有两个指针,一个指向上一个节点( node ),一

    2024年02月10日
    浏览(30)
  • 动态数组和C++ std::vector详解

    std::vector 是C++的默认动态数组,其与array最大的区别在于vector的数组是动态的,即其大小可以在运行时更改。 std::vector 是封装动态数组的顺序容器,且该容器中元素的存取是连续的。 vector的存储是自动管理,不需要人为操作自动实现按需扩张收缩。但实现自动管理的代价就是

    2024年02月13日
    浏览(55)
  • 8.5 【C语言】指向函数的指针

    每次调用函数时都从该地址入口开始执行此段函数代码。函数名代表函数的起始地址。 例8.22 用函数求整数a和b中的大者 解题思路:在主函数调用max函数,除了可以通过函数名调用外,还可以通过指向函数的指针变量来实现。 (2)通过指针变量调用它所指向的函数 类型名(

    2024年02月11日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包