Geekband C++面向对象高级程序设计-第六周课程3

#前言

  使用namespace,

  #使用到变量声明时在定义避免集中存放,并且使用缩排。

#Vector容器1

#include <iostream>
#include <vector>
#include <stdexcept> //exception
#include <cstdlib> //abort
#include <cstdio> //snprintf
#include <ctime>

using namespace std;
 
int main(){
    const int value=1000000;
    
    vector<string> c;
    char buf[10];
    
    clock_t timeStart = clock();
    
    for(long i=0;i<value;i++){
        try{
            snprintf(buf,10,"%d",rand());
            c.push_back(string(buf));    
        }
        catch(exception& p){
            cout << "i=" <<i<<"    "<<p.what()<<endl;
            abort();
        }
    }
    cout << "milli-seconds: " << (clock()-timeStart) <<endl;
    cout << "vector.size()= " <<c.size()<<endl;
    cout << "vector.front()= " << c.front()<<endl;
    cout << "vector.back()= " <<c.back()<<endl;
    cout << "vector.data()= " <<c.data()<<endl;
    cout << "vector.capacity()= "<<c.capacity()<<endl;
    return 0;
}

  #补充说明:

  1. (vector).push_back;vector容器是前闭后开那么放入是在后面放入。试想若可以从前方放入,那么需要每个元素后移位数据庞大消耗时间效率非常高。
  2. vector最初没有给定容器空间大小,当数据增加vector的容量是以2倍的容量扩容。
  3. .size()是容器内存放数据的个数,capacity()是容器申请空间的大小。
  4. 发生异常使用abort()函数退出程序。
  5. vector.front()得到起始元素,vector.back()得到最末元素。
  6. vector.data()得到连续元素的起始地址。

#Vector容器2

 

string target = 123456;
timeStart = clock();
auto pItem = ::find(c.begin(),c.end(),target); 
cout << "::find(),milli-seconds: " << (clock()-timestart) <<endl;
if(pItem!=c.end()){
    cout << "found, " << *pItem <<endl;
}else { cout << "not fount! " << endl;
}

 

  #补充说明

  1. ::find() 模板函数。
  2. !=end() 没有查找到末尾说明查找成功。
  3. find返回iterator,其中返回类型用auto代替
  4. *pItem解参考

#Vector容器3

string target = "123456";
timeStart = clock();
sort(c.begin(),c.end());
string* pItem = (string*)bsearch(&target,(c.data()),c.size(),sizeof(string),compareStrings);
cout << "sort()+bsearch(),milli-seconds:"<<(clock()-timeStart)<<endl;
if(pItem!=NULL){
    cout << "found, " <<*pItem <<endl;
}else{
    cout << "not found" <<endl;
}

   #补充代码

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. 使用排序而后查找元素,而后使用二分查找。
  2. 相比较第一种,直观感觉二分查找会比较快速,但是二分查找并不是通常意义上都是如此快速的。其中排序所占用时间消耗同样很大。

 

原文地址:https://www.cnblogs.com/SKY-ZL/p/8445715.html