一、STL六大部件(components)
C++标准库把非常重要的算法和数据结构都包含在内。
容器要放东西,东西要分配内存。容器是一个模板类,需要操作容器里存的东西。数据在容器中,但是操作数据的算法在别的地方,从而容器与算法分离,这与类中将数据与操作都放在类中所不同。
迭代器就是一种泛化的指针(就把他看做指针)。仿函数有个仿字,说明就是看起来像个函数。
理解:我有1斤苹果,通过分配器(分配苹果的)分配一个篮子只(容器),通过放苹果算法将苹果根据篮子的地址(迭代器)t通过我的手(函数适配器)放每一个苹果。
注:也可以用我的手拿夹子拿苹果去实现放苹果算法,于是这里就有两个仿函数适配器
篮子<苹果,分配器<苹果>> 篮子的名字(basket);
放算法(basket的首格,basket尾格,手(夹子(函数(不选烂苹果),苹果条件(烂苹果))))
int apple[6] = {1,0,1,1,1,0};//1,0分别表示为好和坏苹果
vector<int,allocator<int>> basket(apple,apple+6};
cout<<cout_if(basket.begin(),basket.end(),nol(bind2nd(greater<int>,0));
Q1:我有这么多的容器,那么就会面临选择什么容器?
A1:要根据实际情况选择容器,在选择的时候需要考虑复杂度(Big-oh)
容器([ )“前闭后开”区间),容器不一定是连续的内存空间,可能是一个链表,hashtable等等。
新版本好东西:
for(decl : coll){//coll为任何一个容器,decl 为取容器中的变量
statement
}
例子:
std::vector<double> vec;
for(auto elem:vec)
std::cout<<elem<<std::endl;
for (auto& elem)
elem *= 3;//用了引用再能改变传入的地址中的值
还有一种:
list::iterator ite;
ite = ::find(c.begin(),c.end(),traget);
改为:auto ite = ::find(c.begin(),c.end(),traget);//直接用auto根据右值中的c直接识别处理ite为与c容器同模板类别的迭代器。