容器的分类与各种测试(一)
容器分为:序列式容器、关联式容器、不定序容器
序列式容器有,数组(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<<"\ntest_attay.........\n";
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;
}
运行结果
二分查找几乎不费时间,排序比较费时
不积小流无以成江河