C++的容器(一):c++中所有容器的共通操作函数

C++中的所有容器都支持三个核心能力:

  1. 所有容器提供的都是‘value语义’而非‘reference语义’。可以通过指针元素来实现某些功能。
  2. 容器的所有元素有一个固定的次序(order),你可以以相同的次序多次遍历每个元素。并且每个容器也提供“迭代器生成器”函数,运用这些生成的迭代器可以遍历整个容器。
  3. 你无法保证程序的每个操作都安全。操作者必须确保操作函数的参数都符合要求,因为容器不会抛出异常。

容器(Container)的共通操作函数集(使用ContType表示所有容器类型):

函数 功能
ContType c 产生一个不含有任何元素的空容器
ContType c1(c2)  产生一个一模一样的容器,所有元素都是按值复制的
ContType c(beg, end) 复制p[beg, end)区间内的元素,作为容器初值
c.~ContType()   删除所有元素
c.size() 返回容器中的元素数量
c.empty() 判断容器是否为空,相当于(size()==0),但这个函数可能更快
c.maxsize() 返回元素的最大可能数量
c1==c2 判断是否c1等于c2
c1!=c2 判断是否c1不等于c2
c1 < c2 判断是否c1小于c2
c1 > c2 判断是否c1大于c2
c1 <= c2 判断是否c1小于等于c2
c1 >= c2 判断是否c1大于等于c2
c1 = c2 将c2的元素拷贝复制给c1
c1.swap(c2) 将c1和c2的值做个交换
swap(c1, c2) 这是个全局函数,功能同上
c.begin() 返回一个迭代器,指向第一个元素
c.end() 返回一个迭代器,指向最后一个元素的下一位置,它并不指向最后一个元素
c.rbegin() 返回一个迭代器,指向倒数第一个元素
c.rend() 返回一个迭代器,指向第一个元素的前一位置,它并不指向第一个元素
c.insert(pos, elem) 将elem的一个副本安插于pos处,返回值和pos的意义并不相同
c.erase(beg,end) 移除[beg, end)区间内的所有元素,某些容器会返回没有被移除的第一个元素
c.clear() 移除所有元素,令容器为空
c.get_allocator() 返回容器的内存模型(memory model)

以下为一些实例,对上述部分函数做个说明:

构造函数(从区间中拷贝元素):

int array[] = {1,2,32,3,4,5};
set<int> s(array, array+sizeof(array)/sizeof(array[0]));

构造函数(从标准输入装置读取元素完成初始化操作,标准输入装置方法见博客):

std::deque<int> d((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());//注意std::istream_iterator<int>(std::cin)这条语句在c++中是个声明,不能作为参数,需要在两边加上(),表示这是一个表达式。

交换函数(c1.swap(c2)) / swap(c1, c2) ):

采用赋值构造函数来创建新的容器,之后源容器就不再使用了,这样赋值构造函数会再生成每个元素的拷贝,然后将源容器中的每个元素再删除掉。而且随着元素个数的增长,所需的时间也会增长(O(n)),而如果使用swap()函数,所做的操作仅仅是将两个容器内部的某些指针(指向元素、配置器)进行交换,所需时间为常数时间(O(C))。这就是swap函数的一个应用场景。

原文地址:https://www.cnblogs.com/mindulmindul/p/12225813.html

时间: 2024-08-28 00:53:37

C++的容器(一):c++中所有容器的共通操作函数的相关文章

python中列表常用的几个操作函数

# coding=utf-8#在列表末尾添加新的对像#实例展现函数append()的用法aList=[456,'abc','zara','ijk',2018]aList.append(123)print("Updated List:",aList)输出结果:Updated List: [456, 'abc', 'zara', 'ijk', 2018, 123] #统计列表中某个元素出现的次数#实例展现count()函数的用法aList=[456,'abc','zara','ijk',2

Spring mvc 中使用ftl引用共通文件出错 FreeMarker template error: Error reading included file &quot;/WEB-INF/ftl/common/errormessage.ftl&quot;

初次接触spring mvc,想做一个小的练习项目,结果在ftl文件中引用其它的共通ftl文件时出错. 目录结构如图所示,想在login.ftl中引用common下的errormessage.ftl <#include '/WEB-INF/ftl/common/errormessage.ftl' /> 结果画面报错: FreeMarker template error: Error reading included file "/WEB-INF/ftl/common/errormes

Cocos2d-x中__Dictionary容器以及实例介绍

__Dictionary类在Cocos2d-x 2.x时代它就是CCDictionary类,它是模仿Objective-C中的NSDictionary类而设计的,通过引用计数管理内存.__Dictionary继承于Ref类,因此它所能容纳的是Ref及子类所创建的对象指针. 1.创建__Dictionary对象 创建__Dictionary对象有很多函数,下面是总结常用的函数: static __Dictionary* create().创建__ Dictionary. static __Dict

SpringMVC中IOC容器

1.Spring作用: 1.生态体系庞大,全能型选手![springmvc是其一个子模块,jdbcTemplate能直接操作数据库!] 2.将其他组件粘合在一起 3.IOC容器和AOP Spring的Ioc机制(控制反转和依赖注入)正是用在此处. Spring的Ioc(控制反转和依赖注入) 控制反转[Ioc]:就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控. 控制反转是一种思想,其具体实现就是依赖注入! 依赖注入[DI]:组件之间的依赖关系由容器在运行期决定 ,由容器动

【转】C++中map容器的说明和使用技巧

C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值. 一.map的说明    1   头文件   #include   <map>     2   定义   map<string,   int>   my_Map;   或者是typedef     map<string,   int>   MY_MAP;   MY_MAP   my_Map;     3   插入数据   (1)   my_Map["

Cocos2d-x中__Array容器以及实例介绍

__Array类在Cocos2d-x 2.x时代它就是CCArray类.它是模仿Objective-C中的NSArray类而设计的,通过引用计数管理内存.__Array继承于Ref类,因此它所能容纳的是Ref及子类所创建的对象指针. 1.创建__Array对象创建__Array对象有很多函数,下面是总结常用的函数:?static __Array* create().创建__Array.?static __Array* create(Ref* object, -).使用一系列Ref创建__Arra

初识Java中的容器

记得第一次听到java中的容器是一个师哥说的,当时听着十分神秘.那么今天就来揭开那层神秘的面纱. 首先什么是容器呢? 在书写程序的时候,我们常常需要对大量的对象引用进行管理.为了实现有效的归类管理,我们常常将同类的引用放置在同一数据容器中.由于数据容器中存放了我们随时可能需要使用到的对象引用,所以一般的数据容器要都要能能提供方便的查询.遍历.修改等基本接口功能. 早期的OOP语言都通过数组的方式来实现对引用集的集中管理和维护. 但是数组方式下,数组大小需要提前被确定,并不允许修改大小,导致其作为

理解Docker(6):若干企业生产环境中的容器网络方案

本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 (6)若干企业生产环境中的容器网络方案 Docker 在早期只有单机上的网络解决方案,在 1.19 版本引入了原生的 overlay 网络解决方案,但是它的性能损耗较大,可能无法适应一些生产环

在libvirt 中体验容器

libvirt是一个通用的虚拟化框架,支持xen,kvm,lxc多种虚拟化技术,本文作为一个笔记. 设置LXC为默认(默认为qemu) export LIBVIRT_DEFAULT_URI=lxc:/// virsh -c lxc:/// 可省略 网络设置 NAT NAT是libvirt默认自带,叫做default,通过下面的 命令查看 virsh net-list 假设宿主机有两个网卡,eth0为内网,eth1为外网,我们可以为容器桥接出两个接口: #cat lan.xml <network>