侯捷C++STL 体系结构与内核分析:容器-结构与分类、array测试

在这里插入图片描述
红色框起来的是C++11增加的东西,array由语言的数组包装成class。
Sequence Containers(序列式容器),会按放进去的顺序排列
array要多大有多大,严格限定的大小。vector起点不能动,后面可以自动增长,分配器可以自动扩充。deque,两端可进可出,前面和后面都可以扩充。list,链表,指针串起来,双向的,环状链表。forward-list,单向链表,放一个分配一个。
Associative Containers(关联式容器),有key/value,基于红黑树。
各家编译器都用红黑树来做set/map。set的key就是value,value就是key,不分的。multiset/multimap可以重复,而set/map不能重复。
Unordered Containers(不定序容器),位置会发生改变,基于哈希表。
Separate Chaining能够避免碰撞(元素放进来位置冲突),用的最多解决hash表。链表太长也会重新打散。
严格来说只有前面两类。
测试程序的辅助函数

using std::string;
using std::cin;
using std::cout;

const long ASIZE = 1000000;  //多少个元素

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, "%d", target);
    //sprintf(buf, "%d", 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;
}

array测试:

#include <string>
#include <array>
#include <iostream>
#include <ctime>
#include <cstdio>
#include <cstdlib>  // qsort binarysreach, NULL

#include "pub.h"

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::array;

namespace jj01
{
	void test_array()
	{
		cout << "\ntest_array()......... \n";

		array<long, ASIZE> c;

		//srand((unsigned)time(NULL));
		clock_t timeStart = clock();
		for (long i = 0; i < ASIZE; ++i) {
		    c[i] = rand() % 65535;
		}

		cout << "milli-seconds:" << (clock() - timeStart) << endl;  //布置完数组需要多久
		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();
		
		cout << "-------------------before qsort: --------------" << endl;
		
		/*
		for (long i = 0; i < ASIZE; ++i)
		{
		    cout << "The " << i << " element is:" << c[i] << endl;
		}
		*/

		timeStart = clock();

		qsort(c.data(), ASIZE, sizeof(long), compareLongs);  //最后一个参数定义如何比大小
		
		cout << "qsort(), milli-seconds: " << (clock() - timeStart) << endl;

		cout << "---------------------after qsort:------------------ " << endl;

		//timeStart = clock();
		/*
		for (long i = 0; i < ASIZE; ++i)
		{
		    cout << "The " << i << " element is:" << c[i] << endl;
		}
		*/


		cout << "array.size()= " << c.size() << endl;
		cout << "array.front()= " << c.front() << endl;
		cout << "array.back()= " << c.back() << endl;
		cout << "array.data()= " << c.data() << endl;

		timeStart = clock();  //毫秒数,从起始到现在

		long* pItem = (long*)bsearch(&target, (c.data()), ASIZE, sizeof(long), compareLongs);  //先排序后再去找元素。花费多久时间,排序花费时间久,寻值很快
		cout << "bsearch(), milli-seconds: " << (clock() - timeStart) << endl;  //获得时间差
		
		if (pItem != NULL)
			cout << "found, " << *pItem << endl;
		else
			cout << "not found!" << endl;
	}
}

侯捷老师运行结果
在这里插入图片描述

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页