Chinaunix首页 | 论坛 | 博客
  • 博客访问: 423705
  • 博文数量: 117
  • 博客积分: 5235
  • 博客等级: 大校
  • 技术积分: 1775
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-12 15:51
文章分类

全部博文(117)

文章存档

2012年(9)

2011年(2)

2010年(21)

2009年(13)

2008年(72)

我的朋友

分类: C/C++

2008-12-29 17:26:22

1. stl 简介
STL的一个重要特点是数据结构和算法的分离。
STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装
2. 基本组件
下面的小节说明了三个基本的STL组件:
2.1 迭代器提供了访问容器中对象的方法。
2.2     容器是一种数据结构,如list,vector,和deques ,以模板类的方法提供。
2.3 算法是用来操作容器中的数据的模板函数。
3. 头文件
/* container */
#include <vector>
#include <deque>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
/* iterator */
#include <iterator>
/* algorithm */
#include <algorithm>
4. 名字空间
using namespace std;
5. 简单的例子
#include <string>
// inorder to use cout and endl

#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> cl(100);
int main(void){
    // iostream is needed

    cl[0]=233;
    cout << *(cl.begin()) << endl;
    cl[20]=50;
    vector<int>::iterator intIter = find(cl.begin(), cl.end(), 50);
    if(intIter != cl.end()){
        cout << "Vector contains value" << *intIter << endl;
    }
    else{
        cout << "Vector does not contain 50" << endl;
    }
    return 0;
}

一些注意:

1.对象进出是拷贝
class Widget {
public:
 ...
 Widget(const Widget&); // 拷贝构造函数

 Widget& operator=(const Widget&); // 拷贝赋值操作符

  ...
};
当然由于继承的存在,拷贝会导致分割。那就是说,如果你以基类对象建立一个容器,而你试图插入派生类对象,那么当对象(通过基类的拷贝构造函数)拷入容器的时候对象的派生部分会被删除
一个使拷贝更高效、正确而且对分割问题免疫的简单的方式是建立指针的容器而不是对象的容器。
智能指针的容器
2.判断空
对于任意容器c,写下
if (c.size() == 0)...本质上等价于写下
if (c.empty())...,但这个更好,因为size对于list等是线性操作,需要遍历
3.几乎所有目标区间被插入迭代器指定的copy的使用都可以用调用的区间成员函数的来代替。
3.1
区间构造。所有标准容器都提供这种形式的构造函数:
container::container(InputIterator begin, // 区间的起点

   InputIterator end); // 区间的终点

3.2
区间插入。所有标准序列容器都提供这种形式的insert:
void container::insert(iterator position, // 区间插入的位置

   InputIterator begin, // 插入区间的起点

   InputIterator end); // 插入区间的终点

3.3
区间删除。每个标准容器都提供了一个区间形式的erase,但是序列和关联容器的返回类型不同。序列容器提供了这个:
iterator container::erase(iterator begin, iterator end);
3.4
区间赋值。就像我在这个条款的一开始提到的,所有标准列容器都提供了区间形式的assign:
void container::assign(InputIterator begin, InputIterator end);
4.匿名不一定都有效
ifstream dataFile("ints.dat");
list<int> data(istream_iterator<int>(dataFile), // 警告!这完成的并不

  istream_iterator<int>()); // 是像你想象的那样

----------------
ifstream dataFile("ints.dat");
istream_iterator<int> dataBegin(dataFile);
istream_iterator<int> dataEnd;
list<int> data(dataBegin, dataEnd);
5. 永不建立auto_ptr的容器
如果你根本不知道这回事就不需要知道了

阅读(729) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~