侯捷STL 3. 容器之分类与各种测试 (一)

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则不会

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值