STL基础

vector:

1.头文件#include<vector>

2.声明vector对象,vector<int> vec;

3.尾部插入a:vec.push_back(a);

4.使用下标访问元素,cout<<vec[0]<<endl;

5.使用迭代器访问元素:

for( vector<int>::iterator it=vec.begin();it!=vec.end();it++)
           cout<<*it<<endl;

6.插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

7.删除元素:    vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

8.向量大小:vec.size();

9.清空:vec.clear();

10.重载<

 1 struct MyObject
 2 {
 3     int x;
 4     int y;
 5
 6   bool operator< (const MyObject &a)  const
 7     {
 8         if(x!=a.x)
 9             return x<a.x;
10         else
11             return y<a.y;
12     }
13 };

tip:关于结构体定义的几种情况:

 1 struct  Student
 2 {
 3      string name;
 4 }Stu;
 5
 6 struct
 7 {
 8         string name;
 9 }Stu;
10
11 typedef  struct  Student
12 {
13      string name;
14 }Stu;
15
16 typedef  struct
17 {
18         string name;
19 }Stu; 

set:  set<int> s;

1.元素插入:insert()

2.遍历:

set<int>::iterator it;

for(it=s.begin();it!=s.end();it++)

4.元素删除

s.erase(2);        //删除键值为2的元素

s.clear();

5.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。

set<int>::iterator it;

it=s.find(5);    //查找键值为5的元素

if(it!=s.end())    //找到

cout<<*it<<endl;

else            //未找到

cout<<"未找到";

6.自定义比较函数

(1)元素不是结构体:

//自定义比较函数myComp,重载“()”操作符

 1  struct myComp
 2
 3         {
 4
 5             bool operator()(const your_type &a,const your_type &b)
 6
 7             [
 8
 9                 return a.data-b.data>0;
10
11             }
12
13         }

set<int,myComp>s;

set<int,myComp>::iterator it;

(2)如果元素是结构体,可以直接将比较函数写在结构体内。

 1 struct Info
 2
 3         {
 4
 5             string name;
 6
 7             float score;
 8
 9             bool operator < (const Info &a) const
10
11             {
12
13                 return a.score<score;
14
15             }
16
17         }

set<Info> s;

set<Info>::iterator it;

stack:

1.入栈:s.push(x);

2.出栈:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。

3.访问栈顶:s.top()

4.判断栈空:s.empty(),当栈空时,返回true

5.访问栈中的元素个数:s.size()

queue:

1.入队:q.push(x); 将x 接到队列的末端。

2.出队:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。

3.访问队首元素:q.front(),即最早被压入队列的元素。

4.访问队尾元素:q.back(),即最后被压入队列的元素。

5.判断队列空:q.empty(),当队列空时,返回true。

6.访问队列中的元素个数:q.size();

1.元素插入:insert()
2.中序遍历:类似vector遍历(用迭代器)
3.反向遍历:利用反向迭代器reverse_iterator。
    例:
    set<int> s;
    ......
    set<int>::reverse_iterator rit;
    for(rit=s.rbegin();rit!=s.rend();rit++)
4.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。
            set<int> s;
            s.erase(2);        //删除键值为2的元素
            s.clear();
5.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。
            set<int> s;
            set<int>::iterator it;
            it=s.find(5);    //查找键值为5的元素
            if(it!=s.end())    //找到
                cout<<*it<<endl;
            else            //未找到
                cout<<"未找到";
6.自定义比较函数
    (1)元素不是结构体:
        例:
        //自定义比较函数myComp,重载“()”操作符
        struct myComp
        {
            bool operator()(const your_type &a,const your_type &b)
            [
                return a.data-b.data>0;
            }
        }
        set<int,myComp>s;
        ......
        set<int,myComp>::iterator it;
    (2)如果元素是结构体,可以直接将比较函数写在结构体内。
        例:
        struct Info
        {
            string name;
            float score;
            //重载“<”操作符,自定义排序规则
            bool operator < (const Info &a) const
            {
                //按score从大到小排列
                return a.score<score;
            }
        }
        set<Info> s;
        ......
        set<Info>::iterator it;

时间: 2024-10-26 07:35:40

STL基础的相关文章

【STL基础】deque

deque (double-ended queue) 构造函数: //default: deque<T> d; //空的vector //fill: deque<T> d(n); //n个元素的deque,元素默认初始化 deque<T> d(n, value); //n个元素值为value的deque //range: deque<T> d(first, last); //两个迭代器之间的元素构成的deque deque<T> d(arr, a

【STL基础】list

list 构造函数: //default: list<T> l; //空的list //fill: list<T> l(n); //n个元素, 元素默认初始化 list<T> l(n, value); //n个元素值为value //range: list<T> l(first, last); //两个迭代器之间的元素构成 list<T> l(arr, arr + sizeof(arr) / sizeof(T)); //由内置数组构造 //cop

C++ STL 基础及应用(6) 容器

读者可能有这样的经历,自己编写了动态数组类.链表类.集合类和映射类等程序,然后小心地维护着.其实 STL 提供了专家级的几乎我们所需要的各种容器,功能更好,效率更高,复用性更强,所以开发应用系统应该首选 STL 容器类,摒弃自己的容器类,尽管它可能花费了你很多的开发时间. 本章将介绍 STL 中的通用容器 包括 vector.deque.list.queue和stack.priority_queue.bitset.set和multiset.map和multimap等等. 概述 容器分类 (1)序

C++ STL 基础及应用(3) 迭代器

迭代器(Iterator)是 STL 的核心技术,提供了统一访问容器元素的方法,为编写通用算法提供了坚实的技术基础. 本章将带你编写一个自带迭代器的数组类和一个自带迭代器的链表类,模拟 STL 中的容器,这两个实例能够很清晰地展示 STL 的迭代器思想.并探讨迭代器类应该作为容器类的内部类的原因,然后对 STL 迭代器做一下归纳理解,最后阐述一下 STL 中真正的迭代器概况. 那么什么是迭代器呢? 迭代器即指针,可以是需要的任意类型,它的最大好处是可以使容器和算法分离.例如,有两个容器类,MyA

c++中级 STL基础学习(二)

deque 和vector差不多,可以在前端后端插入,一般用deque取代vector,vector只能在后端插入push_back().deque还可以push_front(). list:双向链表,不能使用下标,和数组vector deque不同.只能使用迭代器,来指示元素.push_front,push_back,insert(位置,值),位置一般用迭代器来指定位置,其中insert返回的是一个迭代器.例如lis.insert(a.begin, 12);返回的是一个迭代器.删除使用eras

C++ STL 基础及应用(7) 函数对象(仿函数)

把函数作为对象是程序设计的新思维.STL 通过重载类中的 operator() 函数实现函数对象功能,不但可以对容器中的数据进行各种各样的操作,而且能够维护自己的状态.因此,与标准 C 库函数相比,函数对象更为通用. 本章将介绍函数指针的使用.函数对象的定义.引入目的.使用方法,C++98 标准和C++11标准下 STL 内置函数对象的详细介绍.适配器类的使用.包括 bind1st bind2nd not1 not2 mem_fun mem_fun_ref ptr_fun bind ref cr

C++ STL 基础及应用(2) 模板与操作符重载

本章将阐述一些具体的 STL 模板思想,并简单介绍操作符重载与模板的联系. 模板是 C++ 语言中重要的概念.它提供了一种通用的方法来开发重用的代码,即以创建参数化的 C++ 类型.模板分为两种类型:函数模板和类模板.函数模板的用法同 C++ 预处理器的用法有一定的类似之处,它们都提供编译代码过程中的文本替换功能,但函数模板还能对类型进行一定的保护.使用类模板可以编写通用的.类型安全的类. 1.编写一个数组元素求和的函数模板. #include <iostream> using namespa

C++STL基础知识

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库. 它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分.该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性.这种现象有些类似于Microsoft Visual C++中的MFC(Microsoft Foundati

STL基础--基本介绍

为什么要使用C++标准库 /* * 为什么使用C++标准库: * 1. 代码重用,不用重新造轮子 * 2. 效率(快速,且使用更少的资源). 现代C++编译器经常对C++标准库的代码有优化 * 3. 准确,更少的bug * 4. 简洁,可读性好:减少控制流 * 5. 标准化,保证可用 * 6. 是编写库的一个很好的榜样 * 7. 对数据结构和算法有更好的认识 */ /* * STL: Standard Template Library * -- 容器和算法,迭代器是容器和算法之间的桥梁,使容器和

STL基础--容器

容器种类 序列容器(数组,链表) Vector, deque, list, forward list, array 关联容器(二叉树),总是有序的 set, multiset根据值排序,元素值不能修改 map, multimap根据key排序,键值不能修改 无序容器(hash 表) 无序set/multiset 无序map/multimap 序列容器 Vector vector<int> vec; // vec.size() == 0 vec.push_back(4); vec.push_ba