1. 容器分类
- 序列式容器(Sequence Containers)
- 关联式容器(Associative Containers) key - value
- 不定序容器(Unordered Containers) C++11新增,本质是hashtable,其实这类也属于关联式容器
关联式容器:键值对,用key查找快,适合大量查找
2. 序列式容器(Sequence Containers)
- Array:C++11新增,将C++数组包装成class,前后无法扩充
- Vector:向量,可自动增长,分配器(allocator)处理扩容
- Deque:双端队列,可以双向扩充
-
-
- Deque 区别于 queue
- queue是队列,先进后出,单向的只能从队首删除元素
- Deque则可以从两端删除
-
- List:std 中 List是双向链表
- Forward - List:C++11新增,单向链表
-
-
- List所占用的内存多于Forward - List,因为多了另一个方向的指针
- PS:一个指针,在32位电脑上占用 4 个字节
-
3. 关联式容器(Associative Containers)
- Set / Multiset
- Map / Multimap
二者都是使用红黑树实现的,红黑树自身会调整成作用平衡,就可以避免某一分支特别长,使得查找效率降低
Multi 前缀,使得元素可以重复,即 key 可以重复
如果以学号存放学生数据,由于学号是唯一的,所以用Set或者Mao
如果存放可以重复的事物,那么就应该用 Multiset / Multimap
4. 不定序容器(Unordered Containers)
- Unordered Set/Multiset
- Unordered Map/Multimap
上面两种容器
本质是hashtable
Separate Chaining 目前公认最好的hashtable实现方法
每个hash桶后面的链表不能太长,太长的话应该打乱重组
5. 测试 Array
5.1. 老师测试代码
其中array要传入两个参数给模板,第一个是数据类型,第二个是array的大小
5.2. 自己代码的实现
void test_array()
{
srand((unsigned int)time(NULL));
cout << "\ntest_array()............. \n";
//array 要有两个参数,第一个是数据类型 long,第二个是array的大小 ASIZE
array<long, ASIZE> c;
//记录起始时间
clock_t timeStart = clock();
for (long i = 0; i < ASIZE; ++i)
{
c[i] = rand();
}
//统计赋值所花费的时间
cout << "milli - seconds :" << (clock() - timeStart) << endl;
cout << "array.size() = " << c.size() << endl;
cout << "array.front() = " << c.front() << endl;
cout << "array.back() = " << c.back() << endl;
//array.data()返回的是array的首地址
cout << "array.data() = " << c.data() << endl;
long target = get_a_target_long();
//再次记录起始时间
timeStart = clock();
//cstdlib中的 快速排序
qsort(c.data(), ASIZE, sizeof(long), compareLongs);
long* pItem = (long*)bsearch(&target, c.data(), ASIZE, sizeof(long), compareLongs);
cout << "qsort() + bsearch(),milli - seconds :" << (clock() - timeStart) << endl;
if (pItem != NULL)
{
cout << "found," << *pItem << endl;
}
else
{
cout << "not found!" << endl;
}
}
遇到的问题:
老师给的ASIZE为500000,我自己使用的时候这个数太大了,超出了我电脑的内存范围,于是就改小了
const long ASIZE = 200000;
long get_a_target_long()
{
long target = 0;
cout << "target ( 0 ~" << RAND_MAX << " )" << endl;
cin >> target;
return target;
}
int compareStrings(const void* a, const void* b)
{
if (*(string*)a > *(string*)b)
{
return 1;
}
else if (*(string*)a < *(string*)b)
{
return -1;
}
else
{
return 0;
}
}
qsort(快排) 和 bsearch(二分查找) 是 cstdlib中的
5.3. 测试结果
这里 size 一共是200000
由于array空间是连续的,所以如果所给的数字太大,就会溢出
如果是vector则不会