STL
- 泛化编程template
- 函数模板
- 类模板
- iterator迭代器
- C++ array(STL array)容器
STL中文名为标准库,是C++标准的规定并且提供了自己编写STL的接口,在编译器实现中统一的分成立几个容器头文件和几个其他的头文件来完成数据结构和算法的抽象,现在编译器使用的是microsoft版本的,这种处理还泛化了接口。
泛化编程template
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
函数模板
template <typename type> ret-type func-name(parameter list)
{
// 函数的主体
}
类模板
template <class type> class class-name {
.
.
.
}
#include<iostream>
#include<vector>
using namespace std;
template<class T>class Stack{
private:
vector<T>elems;
public:
void push(const T&);
void pop();
T top() const;
bool empty() const{
return elems.empty();
}
};
template<class T>void Stack<T>::push(T const&elem){
elems.push_back(elem);
}
template<class T>void Stack<T>::pop(){
if(elems.empty()){
throw out_of_range("hahaha empty stack");
}
elems.pop_back();
}
template<class T>T Stack<T>::top()const
{
if(elems.empty()){
throw out_of_range("haha2233 empty stack");
}
return elems.back();
}
int main(){
try{
Stack<int> intStack;
Stack<string>stringStack;
intStack.push(7);
cout<<intStack.top()<<endl;
stringStack.push("666a");
cout<<stringStack.top()<<std::endl;
stringStack.pop();
cout<<stringStack.top()<<std::endl;
stringStack.pop();
}
catch(exception const&ex){
cerr<<"exception"<<ex.what()<<endl;
return -1;
}
}
iterator迭代器
迭代器按照定义方式分成以下四种。
-
正向迭代器,定义方法如下:
容器类名::iterator 迭代器名; -
常量正向迭代器,定义方法如下:
容器类名::const_iterator 迭代器名; -
反向迭代器,定义方法如下:
容器类名::reverse_iterator 迭代器名; -
常量反向迭代器,定义方法如下:
容器类名::const_reverse_iterator 迭代器名;
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int>v;
for(int i=0;i<70;i++){
v.push_back(i);
}
vector<int>::iterator j;
for(j=v.begin();j<v.end();j++){
cout<<*j<<' ';
*j*=3;
}
for(vector<int>::reverse_iterator r=v.rbegin();r<v.rend();++r){
cout<<*r<<' ';
}
return 0;
}
迭代器按照功能分类
CDemo CDemo::operator++ ()
{ //前置++
++n;
return *this;
}
CDemo CDemo::operator ++(int k)
{ //后置++
CDemo tmp(*this); //记录修改前的对象
n++;
return tmp; //返回修改前的对象
}
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v(100);
for(int i=0;i<v.size();i++){
cout<<v[i];
}
vector<int>::iterator i;
for(i=v.begin();i<v.end();++i){
cout<<*i;
}
for(i=v.begin();i!=v.end();++i){
cout<<*i;
}
i=v.begin();
while(i!=v.end()){
cout<<*i;
i+=2;
}
return 0;
}
迭代器的辅助函数
#include<list>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[5]={1,2,3,4,5};
list<int>lst(a,a+5);
list<int>::iterator p=lst.begin();
advance(p,3);
cout<<"1往前移动3个单位是4:"<<*p<<endl;
advance(p,-1);
cout<<"往后挪动1个单位是3:"<<*p<<endl;
list<int>::iterator q=lst.end();
--q;
cout<<"最后一个"<<*q<<endl;
cout<<"3->5=2:"<<distance(p,q)<<endl;
iter_swap(q,p);
//交换3,5;
for(p=lst.begin();p!=lst.end();++p){
cout<<*p<<" ";
}
return 0;
}
C++ array(STL array)容器
文件源码
自己写的粗略array容器
#include<iostream>
#include<iterator>
namespace std{
template <typename T, size_t N>
class arry{
private:
T elems[N];
public:
f1(){};
f2(){};
bianli()const{//
;;;
}
cunchu(const T&){
}
};
}
using namespace std;
int main(){
std::arry<double, 10> values;
}
#include<iostream>
#include<array>
using namespace std;
int main(){
array<int,4>values{};
for(int i=0;i<values.size();i++){
values.at(i)=2*i;
}
cout<<get<3>(values)<<endl;
//不用迭代器
if(!values.empty()){
for(auto val=values.begin();val<values.end();val++){
cout<<*val<<" ";
}
}
}