#前言
使用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;
}
#补充说明:
- (vector).push_back;vector容器是前闭后开那么放入是在后面放入。试想若可以从前方放入,那么需要每个元素后移位数据庞大消耗时间效率非常高。
- vector最初没有给定容器空间大小,当数据增加vector的容量是以2倍的容量扩容。
- .size()是容器内存放数据的个数,capacity()是容器申请空间的大小。
- 发生异常使用abort()函数退出程序。
- vector.front()得到起始元素,vector.back()得到最末元素。
- 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;
}
#补充说明
- ::find() 模板函数。
- !=end() 没有查找到末尾说明查找成功。
- find返回iterator,其中返回类型用auto代替
- *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;
}
#补充说明
- 使用排序而后查找元素,而后使用二分查找。
- 相比较第一种,直观感觉二分查找会比较快速,但是二分查找并不是通常意义上都是如此快速的。其中排序所占用时间消耗同样很大。