一、STL容器共性机制

STL容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将原数据元素直接放进容器中,也就是说我们提供的元素必须能够被拷贝。

  • 除了queue和stack之外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
  • 通过STL不会抛出异常,需要使用者传入正确参数。
  • 每个容器都提供一个默认的构造函数和默认的拷贝构造函数。
  • 大小相关的构造方法:(1)size()返回容器中元素的个数;(2)empty()判断容器是否为空。

那么当我们在向容器插入元素的时候,需要考虑一种情况,代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std; class Person
{
public:
Person(char* name, int age)
{
this->pName = new char[strlen(name) + ];
strcpy(this->pName, name);
this->mAge = age;
} Person(const Person& p)
{
this->pName = new char[strlen(p.pName) + ];
strcpy(this->pName, p.pName);
this->mAge = p.mAge;
} Person& operator=(const Person& p)
{
if (p.pName != NULL)
{
delete[] this->pName;
} this->pName = new char[strlen(p.pName) + ];
strcpy(this->pName, p.pName);
this->mAge = p.mAge; return *this;
} ~Person()
{
if (this->pName != NULL)
{
delete[] this->pName;
}
}
public:
char* pName;//指针 容易出现浅拷贝的问题
int mAge;
}; void test01()
{
Person p("aaa", );
vector<Person> vPerson;
vPerson.push_back(p);
}
int main(void)
{
test01();//深拷贝
return ;
}

二、STL使用时机

1、vector的使用场景:比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上上次的记录,但却不会去删除记录,因为记录是事实的描述。

2、deque的使用场景:比如排队购票系统,对排队者的存储可以使用deque,支持头端的快速移除,尾端的快速添加。如果采用vector,则头端移除时,会移动大量的数据,速度慢。

3、vector与deque的比较:

(1)vector.at()比deque.at()效率高,比如vector.at(0)是固定的,deque的开始位置却是不固定的;

(2)如果有大量释放操作的话,vector花的时间更少,这跟两者的内部实现有关。

(3)deque支持头部的快速插入与快速移除,这是deque的优点。

4、list的使用场景:比如公共车乘客的存储,随时可能有乘客下车,支持频繁的不确定位置元素的移除插入。

5、set的使用场景:比如对手机游戏的个人得分记录的存储,存储要求从高分到低分的顺序排列。

6、map的使用场景:比如按ID号存储十万个用户,想要快速通过ID查找对应的用户。二叉树的查找效率这时就体现出来了。如果是vector容器,最坏的情况下可能要遍历完整个容器才能找到该用户。

STL容器共性机制和使用场景的更多相关文章

  1. STL - 容器共性机制研究

    C++模板是容器的概念. 理论提高:所有容器提供的都是值(value)语意,而非引用(reference)语意.容器执行插入元素的操作时,内部实施拷贝动作.所以STL容器内存储的元素必须能够被拷贝(必 ...

  2. C++ STL容器底层机制

    1.vector容器 vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入 ...

  3. STL 容器的概念

    STL 容器的概念 在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要. 经典的数据结构数量有限,但是我们 ...

  4. [转]STL 容器一些底层机制

    1.vector 容器 vector 的数据安排以及操作方式,与 array 非常相似.两者的唯一区别在于空间的运用的灵活性.array 是静态空间,一旦配置了就不能改变,vector 是动态数组.在 ...

  5. STL容器

    啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...

  6. STL容器的遍历删除

    STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的 ...

  7. STL容器的内存分配

    这篇文章参考的是侯捷的<STL源码剖析>,所以主要介绍的是SGI STL实现版本,这个版本也是g++自带的版本,另外有J.Plauger实现版本对应的是cl自带的版本,他们都是基于HP实现 ...

  8. STL容器底层数据结构的实现

    C++ STL 的实现: 1.vector      底层数据结构为数组 ,支持快速随机访问   2.list            底层数据结构为双向链表,支持快速增删   3.deque     ...

  9. STL 容器简介

    一.概述 STL 对定义的通用容器分三类:顺序性容器.关联式容器和容器适配器. 顺序性容器是一种各元素之间有顺序关系的线性表.元素在顺序容器中保存元素置入容器时的逻辑顺序,除非用删除或插入的操作改变这 ...

随机推荐

  1. OC导入框架方式#import、@import的区别

    #import负责导入程序所需的文件的信息导入到程序中,随着程序所需的文件越来越多,程序就要导入更多的文件,这就带来了越来越长的编译时间,而且有大量重复的.为了解决这个问题可以采用以下办法解决,创建. ...

  2. Understanding When to use RabbitMQ or Apache Kafka

    https://content.pivotal.io/rabbitmq/understanding-when-to-use-rabbitmq-or-apache-kafka How do humans ...

  3. ERROR 2003 (HY000): Can't connect to MySQL server on "" (113)

    服务器为centos6. 这个原因是因为防火墙的问题 在mysql服务端执行 service iptables stop chkconfig iptables off #永久关闭防火墙 看情况执行 然 ...

  4. javascript重置(base层)(。。。。不完整)

    1.nextSibling浏览器兼容问题 <ul> <li id="item1"></li> <li id="item2&quo ...

  5. 使用concurrent.futures和ProcessPoolExecutor来替代线程和进程

    concurrent.futures和ProcessPoolExecutor这两个类实现的借口分别在不同的线程或进程中执行可调用的对象,这两个类在内部维护者一个工作线程或进程池,以及要执行的队列,这两 ...

  6. poj 2406 Power Strings【字符串+最小循环节的个数】

                                                                                                      Po ...

  7. Freemarker中大于号>的使用

    在Freemarker中,比较数据的大小时候,要注意大于号(>)的使用.如果不注意,程序就会发生异常信息,如下面的例子:   1 2 3 4 <#assign x = 4> < ...

  8. ReverseInteger

    public class ReverseInteger { public static int reverse(int x) { long ret = 0; //如果是个位数,直接返回. if(x/1 ...

  9. vue自定义事件 子组件把数据传出去

    每个 Vue 实例都实现了事件接口(Events interface),即: 使用 $on(eventName) 监听事件 使用 $emit(eventName) 触发事件 1.使用v-on绑定自定义 ...

  10. tp5 数据库Db增删改操作

    添加数据insert $data = [ 'name_cn' => '张三', 'name_en' => 'jack', ]; $res = Db::name('style')->i ...