STL和泛型编程笔记之容器的分类和测试笔记

Posted 阿宝逃离地球

tags:

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

STL和泛型编程笔记之容器的分类和测试笔记

一、STL六大部件

  • Containers
  • Allocators
  • Algorithms
  • Adapters
  • Iterators
  • Functors

使用各个容器的测试

#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
int main(int argc, char const *argv[])
{
	int ai[6] = {12,45,6,78,125,69};
	vector<int,allocator<int>> v(ai,ai+6);
	//count_if: Return number of elements in range satisfying condition
	cout << count_if(v.begin(),v.end(),not1(bind2nd(less<int>,40)));
	return 0;
}

二、容器的分类与结构

三、容器的测试

测试程序的辅助函数

using std::cin;
using std::cout;
using std::string;
//获取目标数值
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);
	return string(buf);
}

//比较long
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;
    }
}

1.Sequence Container

array

namespace testArray{

	const long A_SIZE = 500000L;
	void test_array(){
		cout<< "\\ntest_array()-----------\\n";

		array<long,A_SIZE> c;
		//count time
		long t_start = clock();
		//初始化元素
		for (int i = 0; i < A_SIZE; ++i)
		{
			c[i] = rand();
		}

		//output
		cout << "count time :" << (clock() - t_start) << endl;//初始化整个数组的时间
		cout << "c.size() :" << c.size() << endl;//数组大小
		cout << "c.front() :" << c.front() << endl;//首元素值
		cout << "c.back() :" << c.back() << endl;//尾元素值
		cout << "c.data() :" << c.data() << endl;//首地址

		//find target
		long target = get_a_target_long();
        t_start = clock();

        //先排序后二分查找目标元素
        qsort(c.data(),A_SIZE,sizeof(long),compareLongs);
        long* pItem = (long*)bsearch(&target,c.data(),A_SIZE,sizeof(long),compareLongs);
        //输出查找的时间
        cout<<"qsort()+ bsearch() count time: " << (clock()-t_start)<<endl;
        //输出查找结果
        if(pItem!=NULL){
            cout << "found: " << *pItem <<endl; 
        }else{
            cout << "not found" <<endl;
        }

	}
}
int main(){
    testArray::test_array();
    return 0;
}

终端输出结果如下:

vector

成倍地申请内存空间,当申请不到的时候终止程序

#include <vector>
#include <string>
#include <cstdlib>//bsearch
#include <cstdio>//snprintf
#include <iostream>
#include <stdexcept>//try{...}catch(){...}
#include <ctime>//clock()
#include <algorithm>//find,sort

namespace testVector
{
    void  test_vector(long& value){
        cout<< "test_vector()-----------------"<<endl;
        vector<string> c;

        long t = clock();
        char buf[10];
        for (long i = 0; i < value; i++)
        {
            try
            {
                snprintf(buf,10,"%d",rand());//初始化每一个元素
                c.push_back(string(buf));//vector容器的结果是只能将添加的元素加到末尾,即函数push_back()
            }
            catch(exception& p)
            {
                cout <<"i="<< p.what() << endl;
                abort();//终止程序
            }
        }

        //输出
        cout <<"count time: " << (clock()-t)<<endl;
        cout << "c.size()" << c.size() << endl;//返回c中的元素数
        cout << "c.front()" << c.front() << endl;
        cout << "c.data()" << c.data() << endl;
        cout << "c.capacity()" << c.capacity() << endl;//返回当前为vector分配的存储空间的大小,以元素表示。

        string target = get_a_target_string();
        //两种查找方式花费时间比较
        {
            t = clock();
            //使用全局find函数函数直接查找
            auto pItem =::find(c.begin(),c.end(),target);
            
            //输出查找的时间
            cout<<"find() count time: " << (clock()-t)<<endl;
            //输出查找结果
            if(pItem!=c.end()){ //如果没有等于末尾元素地址则说明找到这个元素
                cout << "found: " << *pItem <<endl; 
            }else{
                cout << "not found" <<endl;
            }

        }

        {
            t = clock();
            //使用sort函数函数先排序后查找
            sort(c.begin(),c.end());
            string* pItem =(string*)bsearch(&target,c.data(),c.size(),sizeof(string),compareStrings);
            
            //输出查找的时间
            cout<<"sort()+ bsearch() count time: " << (clock()-t)<<endl;
            //输出查找结果
            if(pItem!=NULL){ //如果没有等于末尾元素地址则说明找到这个元素
                cout << "found target: " << *pItem <<endl; 
            }else{
                cout << "not found" <<endl;
            }
        }
    }
} // namespace testVector

int main(){
    long v = 1000000L;
    testVector::test_vector(v);
    return 0;
}

输出结果

由此观之,使用find直接查找元素比先排序后查找快速

list

#include <iostream>
#include <ctime>//clock
#include <list>
#include <cstdio>//snprintf
#include <stdexcept>//try..catch..
#include <algorithm>//find,sort
namespace testList
{
    void test_list(long& v){
         cout<< "test_list()-----------------"<<endl;
        list<string> c;

        long t = clock();
        char buf[10];
        for (long i = 0; i < v; i++)
        {
            try
            {
                snprintf(buf,10,"%d",rand());//初始化每一个元素
                c.push_back(string(buf));
            }
            catch(exception& p)
            {
                cout <<"i="<< p.what() << endl;
                abort();//终止程序
            }
        }

        //输出
        cout <<"count time: " << (clock()-t)<<endl;
        cout << "c.size():" << c.size() << endl;//返回列表容器中的元素个数
        cout << "c.max_size():" << c.max_size() << endl;//返回列表容器所能容纳的最大元素数。
        cout << "c.back():" << c.back() << endl;
        cout << "c.front():" << c.front() << endl;

        string target = get_a_target_string();
        //两种查找方式花费时间比较
        {
            t = clock();
            //使用全局find函数函数直接查找
            auto pItem =::find(c.begin(),c.end(),target);
            
            //输出查找的时间
            cout<<"find() count time: " << (clock()-t)<< " ms"<<endl;
            //输出查找结果
            if(pItem!=c.end()){ //如果没有等于末尾元素地址则说明找到这个元素
                cout << "found: " << *pItem <<endl; 
            }else{
                cout << "not found" <<endl;
            }

        }

        {
            t = clock();
            //使用容器自带的sort函数排序后
            c.sort();            
            //输出查找的时间
            cout<<"c.sort() count time: " << (clock()-t)<< " ms"<<endl;
        }
    }
} // namespace testList
int main(){
    long v = 1000000L;
    testList::test_list(v);
    return 0;
}

测试结果:

find函数的查找比排序快

Forward_list

#include <iostream>
#include <stdexcept>//try...catch
#include <algorithm>//find,sort
#include <cstdio>//snprintf
#include <cstdlib>//bsearch, abort()
#include <ctime>//clock
#include <forward_list>

namespace testForwardList
{
    void test_forwardlist(long& v){
        cout<< "test_list()-----------------"<<endl;
        forward_list<string> c;

        long t = clock();
        char buf[10];
        for (long i = 0; i < v; i++)
        {
            try
            {
                snprintf(buf,10,"%d",rand());//初始化每一个元素
                c.push_front(string(buf));
            }
            catch(exception& p)
            {
                cout <<"i="<< p.what() << endl;
                abort();//终止程序
            }
        }

        //输出
        cout <<"count time: " << (clock()-t)<<endl;
        cout << "c.max_size():" << c.max_size() << endl;//返回列表容器所能容纳的最大元素个数。
        cout << "c.front():" << c.front() << endl;
        //单向链表无size()函数和back()函数

        string target = get_a_target_string();
        //两种查找方式花费时间比较
        {
            t = clock();
            //使用全局find函数函数直接查找
            auto pItem =::find(c.begin(),c.end(),target);
            
            //输出查找的时间
            cout<<"find() count time: " << (clock()-t)<< " ms"<<endl;
            //输出查找结果
            if(pItem!=c.end()){ //如果没有等于末尾元素地址则说明找到这个元素
                cout << "found: " << *pItem <<endl; 
            }else{
                cout << "not found" <<endl;
            }

        }

        {
            t = clock();
            //使用容器自带的sort函数排序后
            c.sort();            
            //输出查找的时间
            cout<<"c.sort() count time: " << (clock()-t)<< " ms"<<endl;
        }
    }
} // namespace testForwardList
int main(){
    long v = 1000000L;
    testForwardList::test_forwardlist(v);
    return 0;
}

测试结果:

find()函数查找比排序快

slist

#include <iostream>
#include <cstdio>//snprintf
#include <cstdlib>//abort
#include <stdexcept>//try...catch
#include <ctime>
#include <ext\\slist>
#include <string>

namespace testSList
{
    void test_slist(long& v)
    {
        cout<<"test_slist()------------------"<<endl;
        __gnu_cxx::slist<string> c;
        char buf[10];

        long t = clock();

        for 以上是关于STL和泛型编程笔记之容器的分类和测试笔记的主要内容,如果未能解决你的问题,请参考以下文章

STL和泛型编程笔记之容器的分类和测试笔记

STL标准库 & 范型编程学习笔记:容器的结构分类测试

STL标准库 & 范型编程学习笔记:容器的结构分类测试

Boolan STL与泛型编程第一周笔记

C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化

C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数