#C++ STL标准库与泛型编程
#写在前面
- 重要网站介绍
- www.cpluspluc.com
- en.cppreference.com
- gcc.gnu.org
- 重要书籍介绍
- THE C++ STANDARD LIBRARY
- STL源码剖析
#STL简要介绍
STL六大部件:
1.容器。(存放数据,内存结构已经配置完成)
2.分配器。(支持容器的数据存放)
3.算法。(独立模板函数,对容器数据进行操作)
4.迭代器。(算法与容器的桥梁,帮助遍历容器中的数据)
5.适配器。(对于容器进行一些转换)
6.仿函数。(作用类似一个函数)
#六大部件的示例程序
#补充说明
- allocator分配器的使用范例.11行中vector<int,allocator<int>> 第一个参数int指明存放int类型数据,allocator分配器指明分配int字节大小的内存。若allocator所分配内存大小内容与allocator所需要的内容不同那么会出现错误。
count_if为算法,在STL中最重要的两部分内容之一。- vi(ia,ia+6)设置初值的方式有多种,需要进一步进行知识补充。
- vi.begin(),vi.end()是迭代器,用来遍历容器中的数据。
- bind2nd为函数适配器,猜测本为比较两个对象,但现在第二个对象是数值所以所以需要进行一种转换,用到了函数适配器。
- not1也为一个函数适配器,否定bind2nd的返回值,返回值为是与否。
- less是仿函数。
#复杂度
- O(1)或者O(C):常数时间。
- O(n):线性时间。
- O(log2n):次线性时间。
- O(n2):平方时间。
- O(n3):立方时间。
- O(2n):指数时间。
- O(nlog2n):介于线性以及二次方成长的中间。
#"前闭后开"区间
#解释说明:STL中各个容器所开辟的空间不一定为连续的内存空间,比如说链表,树结构。同时类似于普通数组,其最末尾.end()内不能存储内容空间大小为左闭右开。迭代器同时类似于指针,可以使用*取值,->指向内容。++,--进行遍历操作。具体如下:
#代码示例
Container<T> c;
Container<T>::iterator ite = c.begin();
for(;ite!=c.end();++ite){
}
#range-based for statement(since C++11)
#语法形式
for(decl:coll){
statement
}
#代码示例
for(int i:{2,3,5,7,9,13,17,19}){ cout<<i<<endl; }
std::vector<double> vec;
for(auto elem:vec){
cout <<elem <<endl;
}
for(auto& elem:vec){
elem* = 3;
}
#auto keyword
#auto代码的更多应用
list<string> c;
list<string>::iterator ite;
ite=::find(c.begin(),c.end,target);
可改写为如下形式:
list<string> c;
auto ite=::find(c.begin(),c.end(),target);