1、容器中缓存了用户的节点
2、节点的类要保证节点能够插入到容器中,一般节点类需要提供无参构造函数、拷贝构造函数、重载operator=操作符
3、容器是值语意,而非引用语意 ,容器执行插入操作时,内部执行拷贝动作,所以stl容器中存储的元素必须能够被拷贝。
4、出现指针变量时要考虑到避免野指针的出现,因此类的内部必须提供拷贝构造函数和重载等号(operator=)操作符。
5、除了queue与stack外,每个容器都提供可返回迭代器的函数,用返回的迭代器可以访问元素。
6、STL不会抛出异常,要保证传入的参数正确
7、每个容器提供了一个默认构造函数和拷贝构造函数
各个容器的使用比较
vector | deque | list | set | multiset | map | multimap | |
典型内存结构 | 单端数组 | 双端数组 | 二叉树 | 二叉树 | 二叉树 | 二叉树 | 二叉树 |
可随机存取 | 是 | 是 | 否 | 否 | 否 | key(是) | 是 |
元素搜索速度 | 慢 | 慢 | 非常慢 | 快 | 快 | key(快) | key(快) |
快速安插移除 | 尾端 | 头尾两端 | 任何位置 |
class Teacher
{
public:
Teacher(const char *name,int age)
{
m_name = new char[strlen(name) + 1];
strcpy(m_name, name);
m_age = age;
}
~Teacher()
{
if (m_name != NULL)
{
delete[] m_name;
m_name = NULL;
m_age = 0;
}
}
Teacher(const Teacher &obj)
{
m_name = new char[strlen(obj.m_name) + 1];
strcpy(m_name, obj.m_name);
m_age = obj.m_age;
}
Teacher& operator=(const Teacher &obj)
{
if (m_name != NULL)
{
delete[] m_name;
m_name = NULL;
m_age = 0;
}
m_name = new char[strlen(obj.m_name) + 1];
strcpy(m_name, obj.m_name);
m_age = obj.m_age;
return *this;
}
public:
void PrintT()
{
cout << m_name << " " << m_age << endl;
}
private:
char *m_name;
int m_age;
};
int main()
{
Teacher t1("zhangsan", 22);
vector<Teacher> v1;
v1.push_back(t1);
vector<Teacher>::iterator it = v1.begin();
it->PrintT();
system("pause");
return 0;
}