容器的分类与各种测试

Posted area-h-p

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容器的分类与各种测试相关的知识,希望对你有一定的参考价值。

容器分为:序列式容器、关联式容器、不定序容器

序列式容器有,数组(array)(不可自动扩充),vector(可单端自动扩充),双端队列(deque)(可双端自动扩充),双向链表(list),单项链表(forward-list)

技术图片

 

 

关联式容器有,set/multiset,map/multimap   //multi表示容器内允许有重复的关键字(key), 例如set不允许有重复的关键字(key)

技术图片

 

 关联式容器的底层默认实现时红黑树,因为其拥有高度的平衡性,能大大提高查找数据的效率

 

不定序容器本质上是哈希表

技术图片

 

 ///////////////////////////////////////////////////////////////////////////////

array的测试程序

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<array>
#include<string>
using namespace std;

#define ASIZE 500000L



long get_a_target_long()
{
	long target = 0;
	cout<<"target(0~"<<RAND_MAX<<"):";
	cin>>target;
	return target;
}
string get_a_target_string()
{
	long target = 0;
	char buf[10];
	cout<<"target(0~"<<RAND_MAX<<"):";
	cin>>target;
	snprintf(buf, 10, "%ld", target);
	return string(buf);
}
int compareLongs(const void* a, const void* b)
{
	return (*(long*)a - *(long*)b);
}

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

void test_array()
{
	cout<<"
test_attay.........
";
	array<long, ASIZE> c;
	clock_t timeStart = clock();
	for(long i=0; i<ASIZE; ++i)
		c[i] = rand();

	cout << "milli-seconds : " << (clock()-timeStart) << endl;	//对ASIZE个元素赋值需要的时间
	cout << "array.size()= " << c.size() << endl;		//数组大小
	cout << "array.front()= " << c.front() << endl;	//获得数组第一个元素
	cout << "array.back()= " << c.back() << endl;	//获得数组最后一个元素
	cout << "array.data()= " << c.data() << endl;	//获得数组在内存中的起点地址

	long target = get_a_target_long();

	timeStart = clock();//取程序开始到当前运行的毫秒数(ms)
	qsort(c.data(), ASIZE, sizeof(long), compareLongs);//C语言函数快速排序
	cout << "qsort(), milli-seconds : " << (clock()-timeStart) << endl;	//排序花费的时间    
	long* pItem = (long*)bsearch(&target, (c.data()), ASIZE, sizeof(long), compareLongs); //二分查找
	cout << "qsort()+bsearch(), milli-seconds : " << (clock()-timeStart) << endl;//排序和查找总用时(ms)    
	if (pItem != NULL)
		cout << "found, " << *pItem << endl;
	else
		cout << "not found! " << endl;	
}
int main()
{
	test_array();
	return 0;
}

 运行结果

技术图片

 

 二分查找几乎不费时间,排序比较费时

以上是关于容器的分类与各种测试的主要内容,如果未能解决你的问题,请参考以下文章

容器之分类与各种测试——multimap

容器之分类与各种测试——set

容器之分类与各种测试——map

容器的分类与各种测试——queue

容器的分类与各种测试——deque

容器之分类与各种测试——unordered-multimap