Tanky WooRSS

《C++标准程序库》学习笔记3 -- 第五章

24 Jan 2011
这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。

这一章主要是大概的介绍一下容器,迭代器,算法,仿函数等,为6,7,8,9章的概括。

**

STL的基本概念就是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当粘合剂。任何算法都可以和任何容器交互运作。 stl

**
* 2.(P75) **

容器(Containers) 容器类别用来管理一组元素。 总的来说,容器分为两大类: ①.序列式容器(Sequence containers),是可序(ordered)群集。包括vector, queue, list。 ②.关联式容器(Associative containers),是已序(sorted)群集。包括set, multiset, map, multimap。

关联式容器依据特定的排序准则,自动为其元素排序。排序准则以函数形式呈现,用以比较元素值(value)或元素键(key)。缺省情况以operator< 进行比较,不过也可以自己提供比较函数,定义出不同的排序准则。 eg.

set tk1;   // 从小到大排序
set > tk2;   // 从大到小排序

通常关联式容器是由二叉排序树实作出来的。 另外,C++标准库还提供了容器配接器(Container Adpters), stack, queue, priority queue.

**

关于pair的key/value。 可以通过first,second访问。 eg.

pos->first;
(*pos).second
**

迭代器分类: ①.双向迭代器(Bidirectional iterator),list、set、multiset、map、multimap提供的都是这种迭代器 ②.随机存取迭代器(Random access iterator),vector、deque、strings所提供的就是这种迭代器

**

迭代器之配接器(Iterator Adapters) ①Insert iterators(安插型迭代器) 包括backinserter(), frontinserter(), inserter(),内部分别调用pushback(), pushfront(), insert(). ②Stream iterators(流迭代器) istreamiterator(cin)读入T类型 istreamiterator()产生一个“流结束符” ostream_iterator(cout)标准读出 ③Reverse iterators(逆向迭代器)

下面把三个迭代器一起使用,举个例子:

// Author: Tanky Woo
// Blog:   www.WuTianQi.com

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

int main()
{
    list coll1;
    for(int i=1; i<=9; ++i)
        coll1.push_back(i);
    cout << "安插迭代器\n";
    vector coll2;
    copy(coll1.begin(), coll1.end(), back_inserter(coll2));

    deque coll3;
    copy(coll1.begin(), coll1.end(), front_inserter(coll3));

    set coll4;
    copy(coll1.begin(), coll1.end(), inserter(coll4, coll4.begin()));

    copy(coll1.begin(), coll1.end(), ostream_iterator(cout, " "));
    cout << endl;
    copy(coll2.begin(), coll2.end(), ostream_iterator(cout, " "));
    cout << endl;
    copy(coll3.begin(), coll3.end(), ostream_iterator(cout, " "));
    cout << endl;
    copy(coll4.begin(), coll4.end(), ostream_iterator(cout, " "));
    cout << endl;

    cout << "---------------------------------------------------\n";
    cout << "逆向迭代器\n"; 
        copy(coll1.rbegin(), coll1.rend(), ostream_iterator(cout, " "));
    cout << endl;

    cout << "---------------------------------------------------\n";
    cout << "流迭代器\n"; 
    vector coll5;
    copy(istream_iterator(cin), istream_iterator(), back_inserter(coll5));
    copy(coll5.begin(), coll5.end(), ostream_iterator(cout, " "));
    cout << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}
**

不多说,到后面具体学习了再总结。