理论提高:所有容器提供的都是值(value)语意,而非引用(reference)语意。容器执行插入元素的操作时,内部实施拷贝动作。所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。
- 除了queue与stack外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
- 通常STL不会丢出异常。要求使用者确保传入正确的参数。
- 每个容器都提供了一个默认构造函数跟一个默认拷贝构造函数。
- 如已有容器vecIntA。
- vector<int> vecIntB(vecIntA); //调用拷贝构造函数,复制vecIntA到vecIntB中。
- 与大小相关的操作方法(c代表容器):
c.size(); //返回容器中元素的个数
c.empty(); //判断容器是否为空
- 比较操作(c1,c2代表容器):
c1 == c2 判断c1是否等于c2
c1 != c2 判断c1是否不等于c2
c1 = c2 把c2的所有元素指派给c1
下面举一个源代码的例子,具体如下:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include "vector"
class Teacher
{
public:
Teacher(const char* name, int age)
{
m_pname = new char[strlen(name) + 1];
strcpy(m_pname, name);
m_age = age;
}
~Teacher()
{
if (m_pname != NULL)
{
delete[] m_pname;
m_pname = NULL;
m_age = 0;
}
}
//Teacher t2 = t1;
Teacher(const Teacher& obj)
{
cout << "调用拷贝构造函数" << endl;
m_pname = new char[strlen(obj.m_pname) + 1];
strcpy(m_pname, obj.m_pname);
m_age = obj.m_age;
}
//重载 =号操作符
//t3 = t2 = t1
Teacher& operator=(const Teacher& obj)
{
//先把t2的旧的内存释放掉
if (m_pname != NULL)
{
delete[] m_pname;
m_pname = NULL;
m_age = 0;
}
//根据t1的大小分配内存
m_pname = new char[strlen(obj.m_pname) + 1];
//copy t1的数据
strcpy(m_pname, obj.m_pname);
m_age = obj.m_age;
return *this;
}
public:
void printT()
{
cout << m_pname << "\t" << m_age << endl;
}
protected:
private:
char* m_pname;
int m_age;
};
void main1301()
{
Teacher t1("t1", 31);
t1.printT();
vector<Teacher> v1;
v1.push_back(t1); //把t1拷贝了一份存入到容器中了。
//在STL的容器中,都是值拷贝(对象也一样),所以这里把对象放入到容器中会执行拷贝构造函数
}
void main()
{
main1301();
cout << "hello..." << endl;
system("pause");
return;
}