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;
}