C++ STL : vector

使用boost::python::vector_indexing_suite实现C++ STL容器在Python中的使用 以上测试代码演示了使用VecWrapper类中提供的方法,对C++ STL中的vector容器进行了添加、修改、删除及查询等操作,并且通过vector_indexing_suite类实现了Python可用的下标操作。本文将介绍如何使用boost::python::vector_indexing_suite,将C++ STL中的vector容器导出为Python模块,并提供相应的源代码示例。其中,vecwrapper.so是编译出的Python模块,可以在Python中import该模块进行调用。 阅读详情

1概述

c++提供了array, STL再提供vector、list、deque、stack、queue、priority_queue

vector和array区别

array是静态的空间,不能原地扩充, 一旦配置好了就不能变了,要是不够了,就得我们自己弄,再新建一个、复制、释放,好麻烦的

vector就是STL全包了,不用我们动手了

两倍扩充, 找不到两倍就结束了

#include<vectoe> -> #include<stl_vector.h>

2 迭代器

空间连续 类普通指针 RAI

连续的不用太复杂, 指针就可以了

3 数据结构

start、finish、end_of_storage

容器是前闭后开, finish指向超尾

连续空间支持[]

```C++
struct _Vector_impl
  : public _Tp_alloc_type
  {
pointer _M_start;
pointer _M_finish;
pointer _M_end_of_storage;
```

size() capacity()

新增元素时,一般扩充两倍, 不同编译器不同

扩充: 重新申请、复制、释放

4 构造和内存管理

```C++
vector(size_type __n, const value_type& __value,
     const allocator_type& __a = allocator_type())
  : _Base(__n, __a)
  { _M_fill_initialize(__n, __value); }

void
  _M_fill_initialize(size_type __n, const value_type& __value) // fill_initialize(n, value);
  {
this->_M_impl._M_finish = std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
				_M_get_Tp_allocator());
  }//我看源码就是一直调用函数,最终调用的是construct
```

5 vector操作 push_back、pop_back、emplace_back、erase、clear、insert

5.1 push_back()

```C++
void
  push_back(const value_type& __x)
  {
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) //finish != end_of_storage
  {
    _GLIBCXX_ASAN_ANNOTATE_GROW(1);
    _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
			     __x);  //在finish处构造
    ++this->_M_impl._M_finish;//finish++
    _GLIBCXX_ASAN_ANNOTATE_GREW(1);
  }
else
  _M_realloc_insert(end(), __x);    //没有空间了
  }
```

```C++
template<typename _Tp, typename _Alloc>
void
vector<_Tp, _Alloc>::
_M_realloc_insert(iterator __position, const _Tp& __x) //end(), x
#endif
    {
    const size_type __len =
    _M_check_len(size_type(1), "vector::_M_realloc_insert");//配置新大小
    pointer __old_start = this->_M_impl._M_start;
    pointer __old_finish = this->_M_impl._M_finish;//保存就指针
    const size_type __elems_before = __position - begin();
    pointer __new_start(this->_M_allocate(__len));//重新构造
    pointer __new_finish(__new_start);
    __try//复制原有元素
    {
    // The order of the three operations is dictated by the C++11
    // case, where the moves could alter a new element belonging
    // to the existing vector.  This is an issue only for callers
    // taking the element by lvalue ref (see last bullet of C++11
    // [res.on.arguments]).
    _Alloc_traits::construct(this->_M_impl,
                __new_start + __elems_before,
#if __cplusplus >= 201103L
                std::forward<_Args>(__args)...);
#else
                __x);
#endif
    __new_finish = pointer();

    __new_finish
        = std::__uninitialized_move_if_noexcept_a
        (__old_start, __position.base(),
        __new_start, _M_get_Tp_allocator());

    ++__new_finish;

    __new_finish
        = std::__uninitialized_move_if_noexcept_a
        (__position.base(), __old_finish,
        __new_finish, _M_get_Tp_allocator());
    }
    __catch(...)
    {
    if (!__new_finish)
        _Alloc_traits::destroy(this->_M_impl,
                __new_start + __elems_before);
    else
        std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator());
    _M_deallocate(__new_start, __len);
    __throw_exception_again;
    }
    _GLIBCXX_ASAN_ANNOTATE_REINIT;
    std::_Destroy(__old_start, __old_finish, _M_get_Tp_allocator());//析构原vector
    _M_deallocate(__old_start,
            this->_M_impl._M_end_of_storage - __old_start);//释放内存
    this->_M_impl._M_start = __new_start;
    this->_M_impl._M_finish = __new_finish;
    this->_M_impl._M_end_of_storage = __new_start + __len;
    }
```

空间重新配置后,原来的迭代器都失效了

5.2 pop_back()

```C++
void
  pop_back() _GLIBCXX_NOEXCEPT
  {
__glibcxx_requires_nonempty();
--this->_M_impl._M_finish;  //--finish
_Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish); //析构超尾元素
_GLIBCXX_ASAN_ANNOTATE_SHRINK(1);
  }
```

5.3 erase()

```C++
erase(iterator __first, iterator __last)
  { return _M_erase(__first, __last); 

template<typename _Alloc>
typename vector<bool, _Alloc>::iterator
vector<bool, _Alloc>::
_M_erase(iterator __first, iterator __last)
{
  if (__first != __last)
_M_erase_at_end(std::copy(__last, end(), __first)); //复制last到finish到一个新的空间里并返回到__first上
  return __first;
}
```

5.4 insert()

代码很长,我就不放了, 见侯老师的书或者看源码也行
因为是立着画的, 所以画的不太好

还有个问题,我觉得第一个old_finish和finish一样的话两次复制不就覆盖掉了吗? 没明白

  • 第一种情况: 备用空间够用且插入位置后面的元素大于插入元素
    在这里插入图片描述

  • 第二种情况: 备用空间够用且插入位置后面的元素小于插入元素
    在这里插入图片描述

  • 第三种情况: 备用空间不够用
    在这里插入图片描述

侯老师视频补充知识点

未指定空间大小为0

move()

论文阅读——Bayesian Knowledge Fusion(贝叶斯知识融合) 该篇论文解决了不确定环境中的信息融合问题。想象一下,有多位专家针对同一情况构建概率模型,我们希望汇总他们提供的信息。直接合并每个信息可能会遇到几个问题。例如,专家们可能不同意某个事件发生的概率,或者他们可能不同意两个事件之间因果关系的方向(例如,一个人认为 A 导致 B,而另一个人认为 B 导致 A)。他们甚至可能不同意概率网络中一组变量之间的整个依赖结构。 阅读详情

相关推荐

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 295

STL源码剖析(五)序列式容器之vector

namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_BEGIN_NAMESPACE_CONTAINER /// See bits/stl_deque.h's _Deque_base for an explanation. template<typename _Tp, typename _Alloc> struct _Vector_base {

mei_true的博客 484

VS2015编译配置GDAL(图文并茂、超详细!!!)

文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此

weixin_46196863的博客 3756

C++&Qt经验总结【三】

本期经验分享主要包括:c++模板匹配策略,forward完美转发,深入理解流对象,vector::emplace_back的性能分析,Qt事件系统之事件过滤器

学艺不精的Anton的博客 501

Power Peofiler Kit II 的功耗工具简单上手入门使用

这里仅仅简单记录一下Power Peofiler Kit II 的简单使用,使之快速上手使用起来。官网说明:https://www.nordicsemi.cn/tools/ppk2/上位机软件默认你已经下载好了。

久新的博客 2181

一文掌握SourceTree使用(超级详细)

SourceTree是一款开源的代码仓库客户端工具,界面美观,操作简单,具有代码克隆、本地创建、提交代码、撤销修改,拉取(pull)代码、上传(push)代码、合并分支等操作。对于软件开发人员是一款必备的应用软件。

GM_115的博客 3万+

STL源码剖析

template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class vector : protected _Vector_base<_Tp, _Alloc> { #ifdef _GLIBCXX_CONCEPT_CHECKS // Concept requirements. typedef typename _Alloc::value_type _Alloc_..

mei_true的博客 640

NVIDIA Tao Toolkit环境配置踩坑

请搭配食用该文章为 Tao 安装中可能出现的问题进行解答,如果存在本文章中没出现的问题,欢迎提问,由我复现后更新文章。由于大部分云服务器厂商不能支持 docker,因此我使用的环境为2023年5月27日在平台租的 3080 旧版环境进行实验。

qq_36630208的博客 771

STL之顺序容器

本文主要介绍STL的顺序容器,包括vector、list、deque、stack、queue等。

Spring_24的博客 1133

ASP.NET Core 6 Web API在IIS上的部署与调试

通过以上步骤和配置,你应该能够成功部署并调试你的ASP.NET Core 6 Web API在IIS上。记住,权限和配置是关键,确保你的环境和应用程序代码都正确设置。希望这篇博客对你部署和解决IIS上的问题有所帮助。

m0_74337424的博客 522

SAP BOM反查(可追溯值至顶级)

功能介绍:BOM层数在7层以内的(含7层)的物料,执行后都可以查询到顶级的BOM,逻辑很简单,后期如BOM层数增加,可自行增加查询逻辑。 *&---------------------------------------------------------------------* *& Report ZBOM_CHECK *&---------------------...

SAP阿狸 6060

C++中vector实现及使用详解

vector是)C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的 1、vectot与array        vector与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以

lkn910907的专栏 1620

机器学习特征选择-t检验

在特征选择的过程中通过计算检验统计量值,比较特征之间的统计量的大小,并降序排列,选取统计值较高的特征,从而起到去除差别小的特征(此差别小的特征难以区分不同的额类别)的目的。 以t检验(Student's t test)为例: 假设检验 通过比较两类样本的随机变化,通过计算其p值决定是否拒绝零假设,也即是说:通过计算p值,若p值小于某一阈值则认为两个样本具有显著差异,两个样本是不同的,此时拒绝...

heda3的博客 6700

C++ STL(一)std::vector std::array

需要传入一个已经存在的对象(或对象的副本),会调用该对象的拷贝构造函数(或移动构造函数)。接受构造对象所需的参数并在 vector内部直接构造对象,避免了不必要的拷贝或移动。重新指定容器的长度为num,若容器变长,则以默认值填充新位置。:通常会分配比当前容量大一倍的新内存,以减少频繁的内存分配和拷贝操作。返回指定位置 pos 处的元素的引用,并进行边界检查。返回指定位置 pos 处的元素的引用,不进行边界检查。:将原有元素从旧的内存位置拷贝到新的内存位置。:更新指向新内存的指针,并设置新的容量。

dingyahui的博客 1221

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深入理解并解析C++ stl::vector

vector采用动态数组的方式实现,在实际中挺有用处的一个容器。

2301_81978155的博客 1322

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++ STL std::vector 底层实现

【代码】C++ STL std::vector 底层实现。

zjkyeah的博客 669

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【C++学习笔记】STL容器之std::vector和std::array的区别

std::vector和std::array都是C++ STL中的容器类模板,用于存储一组元素,使用过程中容易混淆,文章整理了两者的区别和使用方法与使用案例。

BTChioa的博客 1956

【C++ | STL】std::vector<T> 详细介绍以及例子代码(很全很详细)

本文总结了 C++ 语言stl 库的 std::vector 的一些常见用法,并举例介绍了各个成员函数的用法。

wkd_007的博客 1981

【C++ STL】std::vector

std::vector容器介绍

AmiaYukiAchami的博客 362

【C++】探索STL中的高效容器:vector

C++中的vector是标准模板库(STL)提供的一种容器,用于存储和操作动态数组。功能类似于我们之前学习的顺序表,它可以在运行时动态调整大小,与C++内置的数组相比,提供了更多的功能和便利性。

Renswc的博客 3688

C++ : STL容器之vector剖析

本文分析了STL中vector容器的实现,重点介绍了构造函数、赋值操作及关键接口的实现细节。主要内容包括: 构造函数实现:默认构造、拷贝构造(深拷贝和复用两种方式)、相同值构造、迭代器构造和initializer_list构造。 赋值重载的现代写法:通过值传参调用拷贝构造,再交换对象内容,利用析构自动释放原空间。 关键接口实现: reserve扩容时避免浅拷贝问题 resize调整大小 erase删除元素并返回下一个迭代器 insert插入元素时处理迭代器失效 实现技巧:使用三个指针(_start、_fin

2301_81454749的博客 2407

C++ 第四阶段 STL 容器 - 第一讲:详解 std::vector

std::vector是C++ STL中最常用的动态数组容器,具有连续存储、自动扩容和高效随机访问等特性。本文详解其核心功能:1)多种构造方式;2)元素访问方法;3)容量管理操作;4)插入删除操作。重点分析性能优化策略,包括预分配内存、使用emplace_back提升插入效率。同时指出常见陷阱如迭代器失效问题,并提供典型应用场景示例,如动态数组模拟、STL算法实现和二维数组构建。通过合理使用vector既能获得数组的随机访问优势,又能享受动态扩容的便利。

弘羽 3552

【C++ | STL】std::vector 复制的几个方法总结

介绍c++的 std::vector 复制到另一个 vector 的几种方法,以及举例说明

wkd_007的博客 1946

C++ STL库详解:vector

详细介绍了vector的功能、使用场景以及使用方法。通过代码详细演示了vector在实际代码编写过程中的作用。分析了在日常vector的使用过程中导致iterator迭代器失效的具体情况和实并进行代码模拟。

2201_75880188的博客 1469

C++ STL:vector和list

STL 描述: C++标准模块库是一个提供了公共编程数据结构和函数的模板类集合,如双连接表(list),配对数组(map),可扩展数组(vector),大串的存储操作(rope)等。STL库可以从http://www.sgi.com/tech/stl/ 获取。 STL可以分为以下几类: 容器类: 顺序容器: vector:动态数组变量,结构体或对象。可以插入在末尾插入

xiaoding133的专栏【Stay hungry,Stay foolish】 5887

【c++】【stl】std::allocator(vector 默认分配器)

内存池优化:频繁小内存分配(比如 vector 频繁扩容)时,内存池可减少new/delete的系统调用开销;对齐要求:某些硬件 / 算法要求内存按 16/32 字节对齐,仅保证基本对齐;调试 / 统计:自定义分配器可统计内存分配次数、大小,排查内存泄漏;共享内存:分配器可从共享内存区域分配内存,实现进程间数据共享。std::allocator 核心职责:分离 “内存分配 / 释放” 和 “元素构造 / 析构”,vector 的所有内存操作都通过它完成;核心接口:处理原始内存(底层。

2402_85646905的博客 750
上一篇: C++ STL : Traits
下一篇: DS:排序
fff_421
博客等级 码龄7年 3粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值