C++学习09

C++ 标准模板库(STL)

STL(Standard Template Libary) 标准模板库  是通用类和算法的集合, 提供给程序员一些标准的操作数据结构的实现  Queues(队列)    Stack (栈)   Lists( 链表)  和  Sets(二叉树)

1.Vectors 向量容器

Vectors包含着一系列连续存储的元素,其行为和数组类似

构造函数:

  vector();

  //在vectors 放入 num个 val值 的 数据

  vector( size_type num, const TYPE &val );

  //拷贝构造函数

  vector( const vector &from );

  //利用迭代器进行区间赋值

  vector( input_iterator start, input_iterator end );

关于运算符:

定义vector:

#include <vector>

vector <类型> v;

vector <类型> v(5,'m');

注意:要引入头文件

常用接口:

1.push_back() 函数

函数原型:

void push_back( const TYPE &val );

作用:

在vector末尾插入数据val

2.size() 函数

函数原型:

 void resize( size_type size, TYPE val );

 作用:

 返回当前vector所容纳元素的数目

3.pop_back() 函数

原型:

void pop_back();

作用:

在vector末尾删除数据

4.erase() 函数

函数原型:

 iterator erase( iterator loc );   //删作指定位置loc的元素

 iterator erase( iterator start, iterator end );//删除区间[start, end)的所有元素.

返回值:

返回值是指向删除的最后一个元素的下一位置的迭代器

  1. insert() 函数

函数原型:

//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器

iterator insert( iterator loc, const TYPE &val );

//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器

void insert( iterator loc, size_type num, const TYPE &val );

在指定位置loc前插入区间[start, end)的所有元素 .

void insert( iterator loc, input_iterator start, input_iterator end );

2.STL库中的迭代器

迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针。 -- 按照指针去操作

Iterators(迭代器)  -- 就是指针

begin() 函数

函数原型:

iterator begin();

作用:

返回指向当前vector第一个元素的迭代器

end() 函数

函数原型:

iterator end();

作用:

返回指向当前vector末尾元素下一个的迭代器  注意:访问末尾元素,需要先将此迭代器自减1

关于迭代器的原理:

案例:

C++
#include <iostream>
//引入模板类的头文件
#include <vector>

using namespace std;

int main(int argc, char const *argv[])
{
    //定义vector  模板类 -- 实例化时必须指定类型
    vector <int> v;
    v.push_back(100);
    v.push_back(200);
    v.push_back(300);
    v.push_back(400);

    vector<int>::iterator it = v.begin();
    for(;it != v.end();it++){
        //查找要删除的位置
        if( *it == 300){
            v.erase(it);
            break;
        }
    }
    //经过erase的操作,此时it迭代器指向的是删除元素的后一个迭代器
    // 所以 如果想要重新遍历所有元素 需要将it迭代器指回 begin()
    for(it = v.begin();it != v.end(); it++){
        cout << *it << endl;
    }


    //使用迭代器遍历输出(指针)
    //定义迭代器
    // vector<int>::iterator it;
    // // it = v.begin();
    // // it = v.end()-1;
    // // cout << *it << endl;
    // for(it = v.begin(); it != v.end(); it++){
    //         cout << *it << endl;
    // }



    return 0;
}
//练习 vector中存储 Person类  (姓名name 年龄age)
//  使用迭代器遍历

3.C++ Double Ended Queues(双向队列)

双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样)。

相比于vector接口,只多了两个头部操作接口

pop_front() 函数

删除双向队列头部的元素。

push_front() 函数

向双向队列头部添加元素。

4.C++ Lists(链表)

Lists将元素按顺序储存在链表中. 与 向量(vectors)相比,  它允许快速的插入和删除,但是随机访问却比较慢.

C++
list<int> first;                                // 定义空链表
list<int> second (4,100);                       // 向链表中插入4个数据,每个数据值是100
list<int> third (second.begin(),second.end());  // 把一个区间赋值给当前链表
list<int> fourth (third);                       // 拷贝构造函数

常用接口

merge () 合并两个链表

函数原型:

void merge( list &lst );

void merge( list &lst, Comp compfunction );

作用:

merge()函数把自己和lst链表连接在一起,产生一个整齐排列的组合链表。如果指定compfunction,则将指定函数作为比较的依据。

C++
#include <iostream>
#include <list>
using namespace std;

int main(int argc, char const *argv[])
{
   //list实例化
   list<int> first, second;

   first.push_back(10);
   first.push_back(20);
   first.push_back(30);
   first.push_back(40);

   second.push_front(100);
   second.push_front(200);
   second.push_front(300);
   second.push_front(400);

    //使用迭代器显示链表
//    for(auto it = first.begin();it != first.end();it++){
//         cout << *it << " " << endl;
//    }
//     cout << "---------------" << endl;
//     for(auto it = second.begin();it != second.end();it++){
//         cout << *it << " " << endl;
//    }

   first.merge(second);
    for(auto it = first.begin();it != first.end();it++){
        cout << *it << " " << endl;
   }
    cout << "---------------" << endl;

    return 0;
}

排序接口

sort()  排序接口

函数原型:

void sort();

void sort( Comp compfunction );

作用:

sort()函数为链表排序,默认是升序。如果指定compfunction的话,就采用指定函数来判定两个元素的大小。

unique() 去除重复的数据

语法:

void unique();

void unique( BinPred pr );

5.C++ Sets(二叉树)

集合(Set)是一种包含已排序对象的关联容器 ----  二叉树

构造函数:

C++
set<int> first;                           // 空的set容器--二叉树

int myints[]= {10,20,30,40,50};
set<int> second (myints,myints+5);        // 向set中放入5个数据

set<int> third (second);                  // 拷贝构造函数

set<int> fourth (second.begin(), second.end());  // 使用迭代器进行区间赋值

set<int,classcomp> fifth;                 // 指定比较方法 classcomp结构体类型

insert() 插入数据

C++
iterator insert( iterator i, const TYPE &val );
void insert( input_iterator start, input_iterator end );
pair insert( const TYPE &val );

说明:

● 在迭代器i前插入val;

●  将迭代器start开始到end结束返回内的元素插入到集合中;

●  在当前集合中插入val元素,并返回指向该元素的迭代器和一个布尔值来说明val是否成功的被插入了。

(应该注意的是在集合(Sets)中不能插入两个相同的元素。)

C++
#include <iostream>
#include <set>
using namespace std;

int main(int argc, char const *argv[])
{
    set<int> tree;

    tree.insert(123);
    tree.insert(3);
    tree.insert(12);
    tree.insert(13);
    tree.insert(34);
    tree.insert(56);

    //遍历二叉树
    for(auto it=tree.begin(); it != tree.end();it++){
        cout << *it << " " << endl;
    }

    return 0;
}

//使用set容器存储 Person (string name, int age)  按照age排序
// 具体方式可以参考英文手册

重新定义比较函数----降序

C
//重新定义比较方法--const修饰函数 就是为了保证函数内不修改对象的任何数据成员
//比较函数通常都会叫const
struct classcomp
{
    bool operator()(const person&l,const person &r) const
    {
        return l.age > r.age;
    }
};

比较自定义数据类型

C
#include <iostream>
#include <set>  //二叉树
using namespace std;

//按照年龄降序输出

class person
{
public:
    person(){}
    person(string name, int age):name(name),age(age){}

    string name;
    int age;
    friend bool operator<(person &a, person &b);
};
bool operator<(const person &a,const person &b){
    return a.age < b.age;

}
//重新定义比较方法--const修饰函数 就是为了保证函数内不修改对象的任何数据成员
//比较函数通常都会叫const
struct classcomp
{
    bool operator()(const person&l,const person &r) const
    {
        return l.age > r.age;
    }
};

int main(int argc, char const *argv[])
{
    // set<person> s;
    set<person,classcomp> s;
    person p1("张三", 20);
    person p2("李四", 26);
    person p3("王五", 17);
    person p4("赵六", 29);

    s.insert(p1);
    s.insert(p2);
    s.insert(p3);
    s.insert(p4);

    for (auto it = s.begin(); it != s.end(); it++)
    {
        cout << "姓名:" << it->name << endl;
        cout << "年龄:" << it->age << endl;
        cout << "+++++++++++++++++++++" << endl;
    }
    
    return 0;
}

6.map 容器

C++
Maps 被用作储存“关键字/值”对
key / value 每一个key对应一个value
map容器中所有数据都是成对存在的  -- pair 对组
#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    //map中所有数据都是成对出现的
    pair<int,string> a(10010,"小王");

    // 取出数据中的键和值
    cout << a.first << endl;  //key
    cout << a.second << endl; //value
    return 0;
}

1.map的构造函数:

C++
 1.map<char,int> first;  // 定义一个空的map容器

    //往 map中插入数据
  first['a']=10;
  first['b']=30;
  first['c']=50;
  first['d']=70;

  2.map<char,int> second (first.begin(),first.end());  //区间赋值
  3.map<char,int> third (second); // 拷贝构造函数

  4.map<char,int,classcomp> fourth; //设置map的排序方式                

2.map接口

insert() 插入接口

C++
iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val );//插入val到pos的后面,然后返回一个指向这个元素的迭代器。

void insert( input_iterator start, input_iterator end );
//插入start到end的元素到map中。

pair<iterator, bool> insert( const pair<KEY_TYPE,VALUE_TYPE> &val );
//只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值


如果插入数据 , 也可以使用重载的 [ ] , 按照键(下标)的形式进行插入
#include <iostream>
#include <map>
using namespace std;

int main(int argc, char const *argv[])
{
    //定义一个空的map
    map<int,string> m;

    //插入数据   -- 第一种 map的插入接口
    // m.insert(pair<int,string>(1,"苏泉"));
    // m.insert(pair<int,string>(2,"张强"));
    // m.insert(pair<int,string>(3,"老赖"));
    // m.insert(pair<int,string>(4,"蜗牛"));

    //重载后的 [] 插入数据 -- 第二种
    m[1] = "苏泉";
    m[2] = "张强";
    m[3] = "孙楠";
    m[4] = "蜗牛";


    //遍历map
    for(auto it=m.begin(); it != m.end();it++){
        cout << "key:" << it->first << endl;
        cout << "value:" << it->second << endl;
    }
    //利用重载[]的方法访问数据
    cout << m[4] << endl;
    return 0;
}

find ()查找接口

C++
 iterator find( const KEY_TYPE &key );

 find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器
#include <iostream>
#include <map>
using namespace std;

class base
{
 public :
base(){}
base(string name): name(name){}

string name;   
};

int main(int argc, char const *argv[])
{
    //定义一个空的map
    map<int,base> m;
    base a("张三");
    base b("李四");
    base c("王五");
    //插入数据   -- 第一种 map的插入接口
    // m.insert(pair<int,base>(1,a));
    // m.insert(pair<int,base>(2,b));
    // m.insert(pair<int,base>(3,c));

    //重载后的 [] 插入数据 -- 第二种
    m[1] = a;
    m[2] = b;
    m[3] = c;


    //遍历map
    for(auto it=m.begin(); it != m.end();it++){
        cout << "key:" << it->first << endl;
        cout << "value:" << it->second.name << endl;
    }
    //利用重载[]的方法访问数据
    cout << m[4].name << endl;

    auto value = m.find(3);
    cout << value->second.name << endl;
    return 0;
}
// 练习: 使用map存储键值对中值为base的类型

目录


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值