标准模板库(STL)

包括三个基本组件:

  1. 容器
  2. 迭代器
  3. 算法

容器

顺序容器:

  • vector
  • deque:双向队列
  • list:双链表,从任何地方插入和删除

关联容器:

  • set
  • multiset
  • map
  • multimap

容器适配器:

  • stack
  • queue
  • priority_queue

  容器都是类模板,实例化后成为容器类,用容器类定义的对象称为容器对象。

成员函数

所有容器都有的成员函数:

  • int size():返回容器中元素的个数
  • bool empty():判断容器是否为空

顺序容器和关联容器中的成员函数:

  • begin():返回指向容器中第一个元素的迭代器
  • end():返回指向容器中最后一个元素后面的位置的迭代器
  • rbegin():返回指向最后一个元素的反向迭代器
  • rend():返回反转后最后一个元素后面位置的元素
  • erase():从容器中删除一个或多个元素
  • clear():清空容器

顺序容器中的成员函数:

  • front():返回容器中第一个元素的引用
  • back():返回容器中最后一个元素的引用
  • push_back():在容器末尾增加新的元素
  • pop_back():删除容器末尾的元素
  • insert():插入一个或多个元素

vector()

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> c;
    int i;
    c.assign(10, 5);  // 10个5赋给c
    for (i = 0; i < 10; i++) cout << c[i] << endl;
    cout << endl;
    cout << c.size() << endl;
    return 0;
}
#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> c(20);
    // 使用assign()之后c的大小也发生了变化
    c.assign(10, 5);
    for (int i = 0; i < c.size(); ++i) {
        c[i] = 5 - i;
        cout << c[i] << endl;
    }
    c.push_back(100);
    int t = c.at(0);
    cout << t << endl;
    t = c.front();
    cout << t << endl;
    t = *(c.begin());
    cout << t << endl;
    t = c.back();
    cout << t << endl;
    return 0;
}
#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> c(20);
    // 使用assign()之后c的大小也发生了变化
    c.assign(10, 5);
    for (int i = 0; i < c.size(); ++i) {
        c[i] = 5 - i;
        cout << c[i] << endl;
    }
    c.push_back(100);
    int t = c.at(0);
    cout << t << endl;
    t = c.front();      // 返回第一个元素
    cout << t << endl;  // 返回第一个元素的地址
    t = *(c.begin());
    cout << t << endl;
    t = c.back();
    cout << t << endl;
    return 0;
}

vector插入元素

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v(3);
    v[0] = 2;
    v[1] = 7;
    v[2] = 9;
    for (int i = 0; i < v.size(); ++i) {
        cout << v[i] << " ";
    }
    cout << endl;
    v.insert(v.begin(), 8);  // 在最前面插入新元素
    for (int i = 0; i < v.size(); ++i) {
        cout << v[i] << " ";
    }
    cout << endl;
    v.insert(v.begin() + 2, 1);
    for (int i = 0; i < v.size(); ++i) {
        cout << v[i] << " ";
    }
    cout << endl;
    v.insert(v.end(), 3);
    for (int i = 0; i < v.size(); ++i) cout << v[i] << " ";
    cout << endl;
    return 0;
}

erase

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> c(5, 123);
    int i;
    int temp;
    cin >> temp;
    c.push_back(temp);
    c.insert(c.begin() + 2, 12);
    // for (i = 0; i < 7; i++) {
    //     cout << c[i] << endl;
    // }
    cout << c.empty() << endl;
    c.erase(c.begin(), c.end());
    cout << c.empty() << endl;
    for (i = 0; i < 7; i++) {
        cout << c[i] << endl;
    }
    return 0;
}

  这里虽然已经把vector中的数据都清空了,但是最后一个for循环还是会把之前写入的数据输出出来。

 迭代器 

迭代器的定义方式

  •  正向迭代器

容器类名::iterator 迭代器名

  • 常量迭代器

容器类名::const_iterator 迭代器名

  • 反向迭代器

容器类名::reverse_iterator 迭代器名

  • 常量反向迭代器

容器类名::const_reverse_iterator 迭代器名

迭代器的类型

  • 正向迭代器
    • ++p, p++  
  • 双向迭代器
    • ++p, p++, --p, p--  
  • 随机访问迭代器
    • p += i  
#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> c;
    for (int i = 0; i < 5; ++i) {
        c.push_back(i);
        cout << c[i] << " ";
    }
    cout << endl;
    vector<int>::iterator p;
    p = c.begin();
    p++;
    *p = 20;
    for (int i = 0; i < 5; ++i) {
        cout << c[i] << " ";
    }
    return 0;
}
#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> arr;
    arr.push_back(6);
    arr.push_back(8);
    arr.push_back(3);
    arr.push_back(8);
    vector<int>::iterator it;
    for (it = arr.begin(); it != arr.end();) {
        if (*it == 8) {
            it = arr.erase(it);
        } else {
            ++it;
        }
    }
    cout << "After remove 8:
";
    for (it = arr.begin(); it < arr.end(); ++it) cout << *it << " ";
    return 0;
}

反向迭代器

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    for (int i = 0; i < 5; ++i) v.push_back(i);
    vector<int>::iterator it;
    for (it = v.begin(); it != v.end(); ++it) {
        cout << *it << " ";
        *it *= 2;
    }
    cout << endl;
    for (vector<int>::reverse_iterator j = v.rbegin(); j != v.rend(); ++j)
        cout << *j << " ";
    cout << endl;
    for (vector<int>::iterator j = v.end() - 1; j >= v.begin(); --j)
        cout << *j << " ";
    return 0;
}

 用于操作迭代器的三个函数模板:

  • advance(p, n): 使迭代器向前或向后移动n个元素
  • distance(p, q): 计算两个两个迭代器之间的距离
  • iter_swap(p, q): 用于交换两个迭代器指向的值
#include <algorithm>
#include <iostream>
#include <list>

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();
    for (int i = 0; i < lst.size(); ++i) {
        cout << *(p++) << "	";
    }
    p = lst.begin();
    advance(p, 2);  // 双向循环链表?
    cout << "
1)" << *p << endl;
    advance(p, -1);
    cout << "
2)" << *p << endl;
    list<int>::iterator q = lst.end();
    q--;
    cout << "3)" << distance(p, q) << endl;
    iter_swap(p, q);
    cout << "4)";
    for (p = lst.begin(); p != lst.end(); ++p) cout << *p << " ";
    return 0;
}

算法

模板

函数模板 

template <typename 类型参数1, typename 类型参数2, ....>

返回值类型 函数名(参数列表) {

// TODO

}

#include <iostream>
using namespace std;
template <typename T>
void Swap(T *a, T *b) {
    T temp = *a;
    *a = *b;
    *b = temp;
}
int main() {  //交换int 变量的值
    int n1 = 100, n2 = 200;
    Swap(&n1, &n2);
    cout << n1 << ", " << n2 << endl;
    //交换char 变量的值
    char c1 = 'A', c2 = 'B';
    Swap(&c1, &c2);
    cout << c1 << ", " << c2 << endl;
    return 0;
}

类模板

template<typename 类型参数1, typename 类型参数2, …>
class 类名
{
//TODO:
};

ClassName <类型> 对象名:

vector<int> a;

#include <iostream>

using namespace std;

template <typename T1, typename T2>
class Point {
   private:
    T1 m_x;
    T2 m_y;

   public:
    Point(T1 x, T2 y) : m_x(x), m_y(y) {}
    T1 getX() const;
    void setX(T1 x);
    T2 getY() const;
    void setY(T2 y);
};

template <typename T1, typename T2>  // 模板头
T1 Point<T1, T2>::getX() const {     /* 函数头 */
    return m_x;
}

template <typename T1, typename T2>
void Point<T1, T2>::setX(T1 x) {
    m_x = x;
}

template <typename T1, typename T2>
T2 Point<T1, T2>::getY() const {
    return m_y;
}

template <typename T1, typename T2>
void Point<T1, T2>::setY(T2 y) {
    m_y = y;
}

int main() {
    Point<int, int> p1(10, 20);
    cout << "x = " << p1.getX() << ". y = " << p1.getY() << endl;
    Point<int, char *> p2(10, "East longitude 180");
    cout << "x = " << p2.getX() << ". y = " << p2.getY() << endl;
    Point<char *, char *> *p3 =
        new Point<char *, char *>("East longitude 180", "north latitude 210");
    cout << "x = " << p3->getX() << ". y = " << p3->getY() << endl;
    return 0;
}
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<intv(3);
    v[0] = 2;
    v[1] = 7;
    v[2] = 9;
    for (int i = 0i < v.size(); ++i) {
        cout << v[i] << " ";
    }
    cout << endl;
    v.insert(v.begin(), 8);  // 在最前面插入新元素
    for (int i = 0i < v.size(); ++i) {
        cout << v[i] << " ";
    }
    cout << endl;
    v.insert(v.begin() + 21);
    for (int i = 0i < v.size(); ++i) {
        cout << v[i] << " ";
    }
    cout << endl;
    v.insert(v.end(), 3);
    for (int i = 0i < v.size(); ++icout << v[i] << " ";
    cout << endl;
    return 0;
}
永远渴望,大智若愚(stay hungry, stay foolish)
原文地址:https://www.cnblogs.com/h-hkai/p/14800739.html