标准模板类库容器类有两种类型,分别是顺序和关联。顺序容器提供对其成员的顺序访问和随机访问,关联容器则经过优化关键值访问它们的元素。
找出下面程序的错误:
class CDemo{
public:
CDemo() : str(NULL);
~CDemo(){
if(str) delete[] str;
}
public:
char* str;
}
void main(){
CDemo d1;
d1.str=new char[32];
strcpy(dl.str,"trend micro");
vector<CDemo>* a1=new vector<CDemo>();
a1->push_back(d1);
delete a1;
}
这个程序的错误在于delete a1时,会销毁其中push的CDemo对象,而由于push_back(d1)时是浅赋值,即没有开辟新的内存保存d1.str的值,使得程序结束后,对d1.str执行了两次内存释放,造成delete同一片内存,程序崩溃。解决这个问题的方法是定义CDemo类的一个深复制构造函数。
//像下面那样,当erase当前iterator指向的元素时,这个iterator就失效了,对其++或取值都会报错。
vector<int> v;
v.push_back(1);
v.push_back(2);
vector<int>::iterator it=v.begin();
v.erase(it);
it++;
cout<<*it;
下面的代码是使用函数指针完成给定的任务,利用静态模板类实现。
#include <iostream>
using namespace std;
template<class T>
class Operate{
public:
static T Add(T a, T b){
return a+b;
}
static T Mul(T a, T b){
return a*b;
}
static T Minus(T a, T b){
return a-b;
}
}
//使用时,如下
int a=19, b=1;
cout<<Operator<int>::Add(a,b);
常用的STL容器:
数据结构 | 描述 | 实现的头文件 |
---|---|---|
向量(vector) | 连续存储的元素 | <vector> |
列表(list) | 由节点组成的双向链表 | <list> |
双队列(deque) | 连续存储的指向不同元素的指针所组成的数组 | <deque> |
集合(set) | 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素拥有相同的次序 | <set> |
多重集合(multiset) | 允许存在两个次序相等的元素的集合 | <set> |
栈(stack) | 后进先出的值的排列 | <stack> |
队列(queue) | 先进先出的值的排列 | <queue> |
优先队列(priority_queue) | 元素的次序是由作用于所存储的值决定的一种队列 | <queue> |
映射(map) | 由{键,值}对组成的集合,按键排序 | <map> |
网友评论