STL中的容器、迭代器、算法都是模板,因此可以操作任何型别。不论是STL预先定义好的或用户自行定义的都可以。然而,由于某些加诸于元素身上的操作行为,某些需求条件也就相应出现了。STL容器元素必须满足以下三个基本条件:

  1. 必须可通过拷贝复制构造函数进行复制。副本与原本必须相等,亦即所有相等测试的结果必须显示原本和副本行为一致。 所有容器都会在内部生成一个元素副本,并返回该暂时性副本,因此拷贝构造函数会被频繁地调用。所以拷贝构造函数的性能应该尽可能地优化,虽然这不是必须的条件之一,但可视为获得良好性能的诀窍。如果对象的拷贝需要耗费大量的时间,你可以选用基于引用计数的智能指针来使用容器,从而避免拷贝对象带来的性能开销。
  2. 必须可以通过operator = 赋值操作符来完成赋值动作。容器和算法都会使用operator = 才能以新元素改写或取代旧元素。
  3. 必须可以透过析构函数完成动作的销毁。当容器元素被移除,容器内的副本将被销毁,因此析构函数绝对不能设计为private。此外,依C++惯例,析构函数绝对不能抛出异常。

这三个条件对任何class而言其实都是隐式成立的。如果某个class既没有为上述动作定义特殊版本,也没定义任何“可能破坏这些动作之健全性的”特殊成员,那么它自然而然也就满足了上述条件。下面几个条件也得满足:

  • 对序列式容器而言,元素的defaut构造函数必须可用。 我们可以在没有给予任何初值的情况下,创建一个非空容器,或增加容器的元素个数,这些元素都将以default构造函数完成。
  • 对于某些动作,必须定义operator = = 以执行相等测试。如果你有搜寻需求,这一点很重要。
  • 在关联式容器中,元素必须定义出排序准则。缺省情况下 operator<, 透过仿函数less<>调用。
#include<vector>
using std::vector;
class  dansir
{
public:dansir() = delete;dansir(const dansir&) = delete;dansir& operator = (const dansir&) = delete;
};
int main(int argc, char *argv[])
{vector<dansir> vtDir;  // 此处会报错,因为默认构造函数被删除了,不存在默认构造函数vector<dansir> vtDir1;vtDir = vtDir1;        // 此处会报错,因为赋值函数被删除了,不存在赋值函数return 0;
}
#include<vector>
using std::vector;
class  dansir
{
public:dansir() {};~dansir() = delete;
};
int main(int argc, char *argv[])
{vector<dansir> vtDir;
dansir s;
vtDir.push_back(s);
vtDir.erase(vtDir.begin()); // 此处会报错,因为erase会调用dansir的析构函数,而析构函数被删除了
return 0;
}

STL 容器中的元素必须满足的条件相关推荐

  1. 如何在C ++中从容器中删除元素

    How to remove elements from container is a common C++ interview question, so you can earn some brown ...

  2. C++ STL 程序员必须会之学会删除容器中的元素 带详细注释实例版本

    //本实例演示容器中各种删除操作的正确玩法 //涉及remove erase remove_if remove_copy unique等函数 #include <iostream> #in ...

  3. MFC中STL容器中Vector,List,Map基本用法汇总

    容器就是数据结构的泛指,迭代器就是指针的泛指,可以指向元素.它可以用来存储数据,就比如杯子用来装水一样.而STL中的容器有很多,它包括vector,list,map,deque,set等.我就简单列举 ...

  4. 7-53 两个有序序列的中位数 (25 分)(思路加详解)用STL容器中的set容器的自动去重过不去

    一:题目 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A 0 ​ ,A 1 ​ ,⋯,A N−1 ​ 的中位数指A (N−1)/2 ​ 的值,即第⌊(N+1)/ ...

  5. vector容器中清空元素(但原来的元素还在)

    一:上码演示 1:清空元素但其原来的元素还在 #include<bits/stdc++.h> using namespace std; int main(){vector <int& ...

  6. (背)顺序容器的操作-向容器中插入元素详细总结

    现在总结如下表:yes表示支持,no表示不支持 代码实例如下: #include <iostream> #include <string> #include <vecto ...

  7. C++中STL容器利用迭代器删除元素小结

    C++中STL容器利用迭代器删除元素小结 在STL容器中删除元素,容易导致迭代器失效,故应该清楚明白其用法,现在总结一下. 转载自:https://blog.csdn.net/yf_li123/art ...

  8. C++中的容器(STL容器)container

    1.容器 容器(container)用于存放数据的类模板.可变长数组.链表.平衡二叉树等数据结构在STL中都被实现为容器.使用容器时,即将容器类模板实例化为容器类时,会指明容器中存放的元素是什么类型的 ...

  9. 【小白学习C++ 教程】二十二、C++ 中的STL容器stack、queue和map

    @Author:Runsen STL 中的栈容器是一种容器适配器.在栈容器中,元素在一端插入并在同一端删除. stack 为了实现堆栈容器,我们需要在我们的程序中包含头文件<stack>. ...

最新文章

  1. 信号实现父子进程之间的同步--sigsuspend的作用
  2. OVS vswitchd启动(三十六)
  3. LeetCode Algorithm 22. 括号生成
  4. 关于SOCKET资源堆栈
  5. 第十周项目1-程序填空与阅读(一)
  6. julia与python对比_有人说Julia比Python好,还给出了5个理由
  7. Android studio吧,Android Studio 连接真机
  8. 【电商系统】—项目缺陷管理(二)
  9. 【SICP练习】102 练习2.79-2.80
  10. 华为全球最快 AI 训练集群 Atlas 900 诞生!
  11. 计算机网络第四章 答案,第四章计算机网络技术练习及答案
  12. VisionPro实现测量工件内圆尺寸
  13. 蘑菇租房爆雷,房东围堵总部,CEO凌晨发公告
  14. 谈中国分布式数据库商业之路:OSM与DB-Inside
  15. Java 编程实例 - 查找数组中的重复元素
  16. 修改Java文件不用重启Tomcat服务
  17. 怎样用计算机计算工程量,送给用EXCEL计算工程量的朋友们一个好方法
  18. 计算反转录转座子插入时间二:提取成对LTRs序列
  19. Mac Book系统时间校准
  20. Excel:多个单元格内容合并——“”-PHONETIC()函数-Text()函数

热门文章

  1. 适合STM32的三大嵌入式操作系统
  2. mysql编辑前200行_巧妙使用SQL Server编辑前200行功能
  3. mysql5 7选路径_MySQL 5.5/5.6/5.7及以上版本安装包安装时如何选择安装路径
  4. const int *p说明不能修改_C语言关键字const和指针结合的使用
  5. 关于jsp中jstl-core标签循环遍历的使用
  6. 【Mac】Chrome中添加截图扩展插件FireShot方法
  7. 字符串相似度算法——Levenshtein Distance算法
  8. luogu P1762 偶数
  9. 阿里前CEO卫哲的万字长文:被马云骂醒,看透B2B 10大核心问题!
  10. centos 安装 acrobat Reader之后