TableOfContents([maxdepth])

STL概述

STL是Standard Template Library的缩写,是C++标准库中最强大、最复杂、最有用的部分。STL主要由容器(container)、跌代子(iterator)、算法(algorithm)所组成。还有仿函数(functor)、适配器(adapter)、配置器(allocator)等辅助组件。

1. 容器container

容器是存放和管理数据元素的数据结构,分为两大类:顺序容器(sequence container)和关联容器(associative container)。

除此以外还有:

容器一般使用模板类来实现

2. 跌代子iterator

跌代子是用来访问容器内元素的对象,类似指针。 跌代子根据能力的不同,分为:

另外还有

3. 算法algorithm

算法是用来处理容器内的元素的一些操作,比如搜索、排序、拷贝、修改等。算法一般使用函数模板来实现。

4. 仿函数functor

用法类似函数的对象。用重载了operator()的类或者模板类来实现

vector向量

1. 接口说明

vector的用法类似于数组,不同的是数组空间可以动态分配。

   1 #include <vector>
   2 namespace std {
   3    template< class T, class Allocator = allocator<T> > vector;
   4 }

T可以是任何类型,但是必须满足:assignable, copyable

1.1. 构造方法

   1 vector< int > a2(10); //构造10个元素的vector
   2 vector< int > a3(10, 5); //构造一个10个元素的vector,每个元素都是5
   3 vector< int > a4(a2); //构造一个vector与a2完全一样
   4 vector< int > a1; // 构造一个空的vector
   5 int values[] = {10, 11, 12, 13, 14};
   6 vector< int > a5( values, values+5); //通过迭代子来构造vector
   7 

1.2. 不变操作和赋值

   1 a1.size( ) //取容器内元素的个数
   2 a1.empty( ) //判断容器是否为空
   3 a1 == a2 //判断两个容器的内容是否相同, 还有!=, <, >, <=, >=
   4 a1 = a2 //将a2全部元素赋给a1
   5 a1.assign( values, values+5 ) //将values[0]到values[4]赋给a1
   6 a1.assign( 10, 5) //给a1赋值10个5
   7 

1.3. 元素访问

   1 a1[ 5 ] //取第5个元素,下标从0开始
   2 a1.at(5) //取第5个元素,带边界检查
   3 a1.front() //取第0个元素
   4 a1.end() //取最后一个元素
   5 

1.4. 跌代子

   1 a1.begin() //随机跌代子,指向a1[0]
   2 a1.end()  //随机跌代子,指向最后一个的下一个
   3 a1.rbegin() //随机跌代子,指向最后一个
   4 a1.rend() //随机跌代子,指向a1[0]的前一个
   5 

1.5. 插入删除操作

   1 a1.insert( a1.begin(), 5); //在a1的最前面插入一个5
   2 a1.insert(a1.end(), 10, 6); //在a1的最后面插入10个6
   3 a1.insert(a1.begin(), values, values+5) //在a1的最前面插入values[0]到values[4]
   4 a1.push_back( 5 ) //在a1的最后面插入一个5
   5 a1.pop_back( ) // 删除a1的最后一个元素
   6 a1.erase( a1.begin() ) //删除a1中的第一个元素
   7 a1.erase( a1.begin(), a1.begin() +2) //删除a1最前面2个元素
   8 a1.resize( 10 ) //将a1元素个数改为10,增加的部分值为默认构造
   9 a1.resize( 10, 6) //将a1元素个数改为10,增加的部分值为6
  10 a1.clear() //清除所有元素
  11 

2. 用法实例

   1 #include <vector>
   2 int main() {
   3    using namespace std;
   4    vector< string > sentence;
   5    sentence.reserve( 5 );
   6    sentence.push_back( “ Hello, “);
   7    sentence.push_back( “how “);
   8    sentence.push_back( “are “);
   9    sentence.push_back( "you ");
  10    sentence.push_back( “?“);
  11    copy( sentence.begin(), sentence.end(), ostream_iterator<string>(cout, “  “));
  12    cout << endl;
  13    cout << sentence.size() << endl;
  14    cout << sentence.capacity() << endl;
  15    swap( sentence[1], sentence[3]);
  16    sentence.insert( find(sentence.begin(), sentence.end(), “?”), “always”);
  17    sentence.back() = “!”;
  18    copy( sentence.rbegin(), sentence.rend(), ostream_iterator<string>(cout, “  “));
  19    cout << endl;
  20 }

用vector代替数组使用

   1 vector < int > a(10); // int a[10];
   2 a[0] = 1;
   3 a[1] = 2;
   4 a[2] = a[0] + a[1];
   5 for( int i = 0; i < a.size(); i++)
   6    scanf( “%d”, &a[i] );

3. vector的实现

vector的实现类似于数据结构中的顺序表

attachment:vector.jpg

   1 template<class T, class Alloc=alloc>
   2 class vector {
   3 public:
   4     typedef T value_type;
   5     typedef value_type* iterator;
   6     typedef size_t size_type;
   7 protected:
   8     iterator start;
   9     iterator finish;
  10     iterator end_of_storage;
  11     //...
  12 public:
  13     iterator begin() { return start; }
  14     iterator end() { return finish; }
  15     size_type reserve(size_type n); //改变容量的大小
  16     size_type capacity() const {  //返回当前容量的大小
  17         return size_type(end_of_storage - begin()); 
  18     } 
  19     void push_back(const T& x) {
  20         if(finish != end_of_storage) {
  21             construct(finish, x);
  22             ++finish;
  23         } else {
  24             insert_aux(end(), x);
  25         }
  26     }
  27     void insert_aux(iterator position, const T& x) {
  28         if(finish != end_of_storage) {
  29             construct(finish, *(finish-1));
  30             ++finish;
  31             T x_copy = x;
  32             copy_backward(position, finish-2, finish-1);
  33             *position = x_copy;
  34         } else {
  35             const size_type old_size = size();
  36             const size_type len = old_size != 0 ? 2 * old_size : 1;
  37             iterator new_start = data_allocator::alloate(len);
  38             iterator new_finish = new_start;
  39             try {
  40                 new_finish = uninitialized_copy(start, position, new_start);
  41                 construct(new_finish, x);
  42                 ++ new_finish;
  43                 new_finish = uninitialized_copy(position, finish, new_finish);
  44             } catch(...) {
  45                 destroy(new_start, new_finish);
  46                 data_allocator::deallocate(new_start, len);
  47                 throw;
  48             }
  49             destroy(begin(), end());
  50             deallocate();
  51             start = new_start;
  52             finish = new_finish;
  53             end_of_storage = new_start + len;
  54         }
  55     }
  56 };
ch3n2k.com | Copyright (c) 2004-2020 czk.