C++总结:STL

STL

1. STL组件
容器(Container) - 管理某类对象的集合
迭代器(Iterator) - 在对象集合上进行遍历
算法(Algorithm) - 处理集合内的元素
容器适配器(container adaptor)
函数对象(functor)

2. STL容器元素的条件
须能够通过拷贝构造函数进行复制
必须可以通过赋值运算符完成赋值操作
必须可以通过析构函数完称销毁动作
序列式容器元素的默认构造函数必须可用
某些动作必须定义operator ==,例如搜寻操作
关联式容器必须定义出排序准则,默认情况是重载operator <

3. 共同操作
size()-返回当前容器的元素数量
empty()-判断容器是否为空
max_size()-返回容器能容纳的最大元素数量
swap用于提高赋值操作效率
比较操作两端的容器必须属于同一类型
如果两个容器内的所有元素按序相等,那么这两个容器相等
采用字典式顺序判断某个容器是否小于另一个容器
begin()-返回一个迭代器,指向第一个元素
end()-返回一个迭代器,指向最后一个元素之后
rbegin()-返回一个逆向迭代器,指向逆向遍历的第一个元素
rend()-返回一个逆向迭代器,指向逆向遍历的最后一个元素之后
insert(pos,e)-将元素e的拷贝安插于迭代器pos所指的位置
erase(beg,end)-移除[beg,end]区间内的所有元素
clear()-移除所有元素

4.vector

#include <iostream>
int main(){
    vector<int> a;
    for (int i = 0; i < 5; ++i){
        a.push_back(5 - i);
    }
    cout << a.size() << endl;
    a.pop_back();
    a[0] = 1;
    cout << a.size() << endl;
    for (int i = 0; i < (int)a.size(); ++i){
        cout << a[i] << ", " << endl;
    }    cout << endl;
     sort(a.begin(), a.end());
    cout << "Size: " << a.size() << endl;
    for (int i = 0; i < (int)a.size(); ++i){
        cout << a[i] << ", " << endl;
    }
    cout << endl;

    a.clear();
    cout << "Size: " << a.size() << endl;
    return 0;
}

5.map和multimap

struct T1{
    int v;
    bool operator<(const T1 &a)const{
        return (v < a.v);
    }
};

struct T2{
    int v;
};
struct cmp{
    const bool operator()(const T2 &a, const T2 &b){
        return (a.v < b.v);
    }
};
struct cmp{
    const bool operator()(const T2 &a, const T2 &b){
        return (a.v < b.v);
    }
};

int main(){
    map<T1, int>mt1; //example for user-defined class
    map<T2, int, cmp>mt2; //example for user-defined class(functor)

    map<string, int> m2;
    map<string, int>::iterator m2i, p1, p2;
    //map<string, int, greater<string> >m2;
    //map<string, int, greater<string> >::iterator m2i, p1, p2;
   m2["abd"] = 2;
    m2["abc"] = 1;
    m2["cba"] = 2;
    m2.insert(make_pair("aaa", 9));
    m2["abf"] = 4;
    m2["abe"] = 2;
    cout << m2["abc"] << endl;
    m2i = m2.find("cba");
    if(m2i != m2.end()){
        cout << m2i->first << ": " << m2i->second << endl;
    }else{
        cout << "find nothing" << endl;
    }
    cout << "Iterate" << endl;
    for(m2i = m2.begin(); m2i != m2.end(); m2i++){
        cout << m2i->first << ": " << m2i->second << endl;
    }
}
main(){
    multimap<string, int> mm1;
    multimap<string, int>::iterator mm1i, p1, p2;
    mmint 1.insert(make_pair("b", 3));
    mm1.insert(make_pair("a", 0));
    mm1.insert(make_pair("b", 5));
    mm1.insert(make_pair("c", 4));
    mm1.insert(make_pair("b", 2));
    cout << mm1.size() << endl;
    for(mm1i = mm1.begin(); mm1i != mm1.end(); mm1i++){
        cout << mm1i->first << ": " << mm1i->second << endl;
    }
    cout << "COUNT: " << mm1.count("b") << endl;
    cout << "Bound: " << endl;
    p1 = mm1.lower_bound("b");
    p2 = mm1.upper_bound("b");
    for(mm1i = p1; mm1i != p2; mm1i++){
        cout << mm1i->first << ": " << mm1i->second << endl;
    }

    return 0;
}

6.set和multiset

struct T1{
    int key;
    int value1, value2;
    bool operator<(const T1 &b)const{
        return (key < b.key);
    }
};

struct T2{
    int key;
    int v1, v2;
};
struct T2cmp{
    bool operator()(const T2 &a, const T2 &b){
        return (a.key < b.key);
    }
};
int main(){
    set<T1> s2;
    set<T2, T2cmp> s3;

#if 1
    set<string>s1;
    set<string>::iterator iter1;
#else
    set<string, greater<string> >s1;
    set<string, greater<string> >::iterator iter1;
#endif
    s1.insert("abc");
    s1.insert("abc");
    s1.insert("abc");
    s1.insert("bca");
    s1.insert("aaa");
cout << "ITERATE:" << endl;
    for (iter1 = s1.begin(); iter1 != s1.end(); iter1++){
        cout << (*iter1) << endl;
    }

    cout << "FIND:" << endl;
    iter1 = s1.find("abc");
    if(iter1 != s1.end()) {
        cout << *iter1 << endl;
    }else{
        cout << "NOT FOUND" << endl;
    }

    return 0;
}

7.
pair 模板: pair模板可以用于生成 key-value对

8.Algorithm(算法)

  1. count:
    size_t count(InIt first, InIt last, const T& val);
    计算[first,last) 中等于val的元素个数
  2. count_if
    size_t count_if(InIt first, InIt last, Pred pr);
    计算[first,last) 中符合pr(e) == true 的元素 e的个数
  3. min_element:
    template
    FwdIt min_element(FwdIt first, FwdIt last);
    返回[first,last) 中最小元素的迭代器,以 “< ”作比较器
  4. max_element:
    template
    FwdIt max_element(FwdIt first, FwdIt last);
    返回[first,last) 中最大(不小)元素的迭代器,以 “< ”作比较器
  5. for_each
    template<class InIt, class Fun>
    Fun for_each(InIt first, InIt last, Fun f);
    对[first,last)中的每个元素 e ,执行 f(e) , 要求 f(e)不能改变e

案例演示

#include <vector>
#include <iostream>
#include <numeric>
#include <list>
#include <algorithm>
using namespace std;
class CLessThen9  {
public:
	bool operator()( int n) { return n < 9; }
};
void outputSquare(int value ) {  cout << value * value << " "; }
}
main() {
	const int SIZE = 10;
	 
	int a1[] = { 100,2,8,1,50,3,8,9,10,2 };
	vector<int> v(a1,a1+SIZE);
	ostream_iterator<int> output(cout," ");
	cout << endl << "2)";
	cout << count(v.begin(),v.end(),8);
	cout << endl << "3)";
	cout << count_if(v.begin(),v.end(),CLessThen9());
    cout << endl << "4)";
	cout << * (min_element(v.begin(),v.end()));
	cout << endl << "5)";
	cout << * (max_element(v.begin(),v.end()));
	cout << endl << "7) ";
	for_each(v.begin(),v.end(),outputSquare);
}

输出:
41
5100
7) 10000 4 64 1 2500 9 64 81 100 4

  1. find
    template<class InIt, class T>
    InIt find(InIt first, InIt last, const T& val);
    返回区间 [first,last) 中的迭代器 i ,使得 * i == val
  2. find_if
    template<class InIt, class Pred>
    InIt find_if(InIt first, InIt last, Pred pr);
    返回区间 [first,last) 中的迭代器 i, 使得 pr(*i) == true
  3. binary_search 折半查找,要求容器已经有序且支持随机访问迭代器,返回是否找到
  • template<class FwdIt, class T> bool binary_search(FwdIt first, FwdIt
    last, const T& val); 这个版本,比较两个元素x,y 大小时, 看 x < y
  • template<class FwdIt, class T, class Pred> bool binary_search(FwdIt
    first, FwdIt last, const T& val, Pred pr); 这个版本,比较两个元素x,y 大小时, 看 pr(x,y)
  1. equal_range
    template<class FwdIt, class T>
    pair<FwdIt, FwdIt> equal_range(FwdIt first, FwdIt last, const T& val);
    要求[first,last)是有序的,
    返回值是一个pair, 假设为 p, 则
    [first,p.first) 中的元素都比 val 小
    [p.second,last)中的所有元素都比 val 大

  2. reverse
    template
    void reverse(BidIt first, BidIt last);
    颠倒区间[first,last)顺序

总结:

STL由一些可适应不同需求的集合类(collection class),以及在这些数据集合上操作的算法(algorithm)构成,它是C++标准程序库的核心,深刻影响了标准程序库的整体结构。学好STL可以非常简单的完成一些任务。对于STL,目前我们只是学到了使用它,但它是高度封装的,所以我们课文也可了解背后的秘密。这一模块,我简单的举了几个例子,虽然这些例子是以教学为基础举例,但它可以很好的代表各个知识点,形象而具体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值