这篇记录下容器的知识:
C++标准库中的容器大概分为:顺序容器和关联容器。
容器元素要求:复制和赋值(IO对象就不行)
顺序容器有:vector、list、deque、stack、queue、priority_queue。
stack、queue是用deque实现的,priority_queue支持随机访问,所以是用vector实现的。
关于vector、list和java中有些区别。
vector更像java中的list,容器中元素连续存放,可以通过索引访问元素(既可以随机访问容器中的某一个元素)。插入删除越靠前代价越高。
而C++中的list有点像java中的linkedlist,不支持随机访问,需要遍历访问,但是插入、删除很快。
而deque又有vector与list的一些特点。能快速随机的访问,插入删除操作在首部或尾部效率不错。
但是vector做了一些优化,在初始化容器的时候,容器的容量一般都大于容器元素的个数,这样可以防止容器扩容带来的开销(复制元素、清除以前容器、开辟新空间)。
这些容器也都定义了自己的迭代器,begin()\rbegin()、end()\rend()这可以表示一个容器的迭代器范围,list因为不能随机访问,所以迭代器不支持比较和算术运算。
插入元素:insert(插入一个元素,就返回该元素的迭代器,否则为void),push_back,push_front(list、deque),push_返回void
删除元素:erase(返回下一个元素,如果删除元素不存在就会出错),clear,pop_back,pop_front(list、deque),pop_返回void
访问元素:front、back、下标或者at(下标),下标操作只使用于vector、deque。如果没有改元素,这些访问都将出错。
如果元素不存在进行访问或者删除一般会出错。所以在访问或者删除前,应该进行查询,使用find方法,如果不存在就返回end迭代器。
赋值:
swap代价最小(感觉只是名字变了),支持=号复制,assign是先删除再添加,支持一个迭代器范围或者n个相同元素作为参数。如果不同容器元素类型不同但是兼容,就可以使用assign函数。
容器容量:size,max_size(1073741823),resize,capacity、revserve(大于等于size)。
关联容器:map、set、multimap、multiset
首先容器中元素为pair<T1,T2>类型,这和java中的Entity比较像。有构造方法,也有make_pair方法构造。
T1就为pair.first,T2为pair.second。
map为K-V,K必须定义((默认)使用<来比较);自身比较为false,相互不小于就为相等。
有几个属性:key_type键的类型,mapped_type值的类型,value_type为pair类型<const key_type, mapped_type>这个和java又有些差别。
map支持下标访问,如果不存在就添加,也支持insert插入操作,如果K存在就不改变map这个和java中的put有些差别,并且插入单个元素则返回:
pair<map<K,V>::iterator, bool> bool表示是否成功,pair的T1表示插入元素的pair类型。插入多个元素返回void。
map元素的查找:count(K),find(K),find如果没找到返回end迭代器。
map删除操作:erase(K)返回size_type表示删除元素个数。
如果使用erase删除一个迭代器,那么这个迭代器必须在容器中,不能为end,返回void。
set只有key的集合,value_type与key_type一样。
添加删除和map操作类似,key都是唯一,不能修改。
multimap、multiset支持K对应多个实例。
multimap中同一个key的多个实例会相邻存放,count返回大于1,find指向第一个关联元素的迭代器。
为了更好的操作,容器还提供了lower_bound(K)和upper_bound(K)表示同一个key的多个实例的边界迭代器[),也提供了一个整合迭代器equal_range,存放的是pair对象,second为upper_bound(K),first为lower_bound(K)。
另外string也可以被看成是一个容器,它额外支持下标插入方法,substr,append,replace以及众多的find方法。
最后关于迭代器失效,这个和java中很相似,java中对一个产生迭代器的集合做增加删除修改会出现modifyException。C++中也会有相似的情况,比如对一个vector做添加处理,添加元素之后所有的迭代器都会失效。迭代器失效就不能再使用,如果再次使用可能会导致与悬垂指针类似的错误。(悬垂指针:指向对象清除,但是指针仍指向原地址)
分享到:
相关推荐
很好的c++学习总结(C++学习忠告、类的使用、类与内存分配。。。。。。)
在C++学习中,C Primer是一本经典的入门书籍,C++11是该语言的一个重要版本,它引入了许多新的特性和改进,比如自动类型推导、智能指针、基于范围的for循环、lambda表达式等。Boost是一个C++库集合,包含了许多实用...
C++个人学习总结- 完善中 -不是很好,但还是拿出来分享一下
初学者怎样学习C++,方法,步骤,态度等,C++学习方法总结很详细!
自己总结的一点C++ MFC方向的学习知识点,以后还会不断地学习,总结
2. **面向对象编程**:C++的核心特性之一是其面向对象编程(OOP)概念,包括封装、继承和多态。封装允许我们将数据和操作这些数据的方法打包到一个类中。继承使我们能创建新类,这些新类可以从现有类(基类)继承...
在深入探讨C++学习的总结报告之前,我们首先理解C++是一种强大且广泛应用的编程语言,它具有面向对象、高效和可移植性等特性。实训是学习任何技能的关键环节,尤其是编程,因为理论与实践相结合能更好地巩固知识并...
以下是对C++学习的一些关键知识点的总结: 1. **基础知识**:C++起源于C语言,因此掌握C语言的基本语法,如变量、数据类型、运算符、流程控制语句(if-else, switch, for, while)以及函数的使用是学习C++的起点。 ...
通过学习《C++ Primer》,不仅可以掌握C++的基本语法和编程技巧,还能理解面向对象编程的核心思想,为后续深入学习C++标准库、STL、设计模式以及并发编程等高级主题打下坚实基础。对于希望从事IT行业的程序员来说,...
#### 三、代码优化总结 通过对 C++98 和 C++11 两个版本的代码进行对比分析,我们可以看到 C++11 在代码结构、资源管理和异常处理方面带来了显著的改进。这些改进不仅让代码更加简洁和易懂,还提高了程序的稳定性和...
这份"C++学习总结"是为面试准备的,旨在帮助你掌握核心概念并能应对面试中的各种问题。下面我们将深入探讨C++的一些关键知识点。 1. **基础语法**:C++的基础包括变量、数据类型(如int、float、char)、运算符(如...
C++是一种支持多种编程范式的高级编程语言,包括过程化、面向对象和泛型编程。从给出的文件内容中,我们可以总结出...学习C++不仅需要掌握语法,更要理解面向对象编程的思想和原则,以便有效地利用C++进行软件开发。
### C++基础知识总结 ...这些基础知识对于理解 C++ 程序设计至关重要,也是进一步学习面向对象编程的基础。接下来的部分将更深入地探讨 C++ 中的高级特性,如数组、字符串、控制结构、函数、类和对象等。
这份资源集成了C++学习的多个重要方面,包括基础概念、高级特性、面试常见问题以及内存管理等,非常适合对C++感兴趣或者准备面试的人士进行深入学习。 1. **C++语言概述**:C++是在C语言的基础上发展起来的,它引入...
根据题目描述中的“经典,适合初学者,从例程出发,一步步让学习者进入状态”,这里推荐一些优质的Visual C++学习资源: 1. **官方文档**:微软官方提供的Visual C++文档是非常全面的学习资源,涵盖了从基础知识到...
C++实训总结0000 C++是一种面向对象的编程语言,它继承了C语言的许多特点。通过学习C++,可以掌握基本语法知识,熟悉面向对象程序设计,并通过实践达到提升编程技术的目标。 学习目标: * 通过自学,掌握C++基本...
### C++学习资源下载地址详解 #### 一、引言 C++作为一种广泛使用的编程语言,在软件开发领域占据着举足轻重的地位。对于初学者和资深开发者来说,获取高质量的学习资源至关重要。本文将详细介绍一系列C++学习资料...