C++ STL基础

STL

标准模板库(Standard Template Library),是一个C++软件库,大量影响了C++标准程序库但并非是其的一部分。

这个库包括3种类型的通用项:容器、迭代器和算法

有了STL,程序员就不必编写自己的类和函数,能够利用预先打包好的通用工具来解决先用的问题。

下面简单介绍几种最常用的STL工具,string、map、set、vector、iterator。以后有时间补充一下list、queue、stack等。
参考文献:C++ STL快速入门

string

头文件

#include <string>

初始化字符串

string s1;//初始化字符串,空字符串
string s2 = s1; //拷贝初始化,深拷贝字符串
string s3 = "ABCD"; //直接初始化,s3存了字符串

string操作
在这里插入图片描述
string的IO操作
使用cin读入字符串时,遇到空白就停止读取。
" Hello World"

cin>>s1; //Hello

用getline可以获取一整行内容。

string str;
getline(cin, str);
cout << str << endl;

vector

可以把向量vector理解为动态的数组。
头文件

#include <vector>

初始化

//T是某种类型
vector<T> v1;
vector<T> v2=v1;
vector<T> v3={a,b,c...};

如何向vector添加元素?
使用push_back加入元素,并且这个元素是被加在数组尾部的。

for (int i = 0; i < 20; i++)
{
    v1.push_back(i);
}

vector基本操作:
在这里插入图片描述
常用增删操作:
在这里插入图片描述
介绍完容器的用法,可以开始引入迭代器

迭代器

迭代器(iterator)是一个对象,用于引用储存在容器中的元素。因此,它是一个通用指针。

迭代器是一种访问元素的方法,下面介绍迭代器的声明

容器类型::iterator 容器名 
vector<int>::iterator iter;

迭代操作
以vector向量为实例:用迭代器遍历输出容器中的元素

vector<T>::iterator iter;
for(iter=v1.begin();iter!=v1.end();iter++)
{
	cout<<*iter<<endl;
}

另外,在关系容器中(比如map),初始化iter为m.begin(),这个时候如果输出*iter则会报错。一般用->符号来访问关联容器元素。

以下是迭代器的基本运算:
在这里插入图片描述

set

集合(set)是按特定顺序存储唯一元素的容器。

set里面的元素是有序的且唯一的,只要你往set里添加元素,它就会自动排序,而且,如果你添加的元素set里面本来就存在,那么这次添加操作就不执行。

set支持大部分的map的操作,但是set不支持下标的操作,而且没有定义mapped_type类型。

头文件

#include <set>

初始化

set<T> s;
set<T> s(s1);
set<T> s(b, e);//b和e分别为迭代器的开始和结束的标记

基本操作

  • insert(key_value); 将key_value插入到set中 ,返回值是pair<set::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。
  • inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.
  • erase(iterator) ,删除定位器iterator指向的值
  • erase(first,second),删除定位器first和second之间的值
  • erase(key_value),删除键值key_value的
  • find() ,返回给定值值得定位器,如果没找到则返回end()。
  • count() 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。

set中数据只能通过insert()函数进行插入(有序且具备唯一性)。

set<int> s;
s.insert(1);//插入一个1

begin()    ,返回set容器的第一个元素
end()      ,返回set容器的最后一个元素
clear()    ,删除set容器中的所有的元素
empty()    ,判断set容器是否为空
max_size()   ,返回set容器可能包含的元素最大个数
size()      ,返回当前set容器中的元素个数
rbegin     ,返回的值和end()相同
rend()     ,返回的值和rbegin()相同

map

map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。map运用了哈希表地址映射(Mapped Value)的思想,也就是key-value(键值对)的思想,来实现的。

  • 对于迭代器来说,可以修改实值,而不能修改key。
  • 容器中不存在同时拥有相同 Key 值的两个元素;
  • 关联容器中的元素的参考地址指的是其 Key 值,而不是他们在容器中的绝对地址;
    头文件
#include <map>

初始化构造方式

 	//=========================
    //  map 的多种构造函数
    //=========================

    // 1. 直接定义,<键,值>
    map<char,int> mymap;
    mymap['a'] = 10;
    mymap['b'] = 60;
    mymap['c'] = 30;
    mymap['d'] = 90;
    mymap['e'] = 50;
	
    // 2. 复制
    map<char, int> second(mymap);

    // 3. 通过迭代器
    map<char, int> third(mymap.begin(),mymap.end());

    // 4. 重新定义 Compare 对象,该对象内部对运算符 () 进行重载
    map<char, int, classcomp> fourth;

    // 5. 通过函数指针
    bool(*fn_pt)(char, char) = fncomp;
    map<char, int, bool(*)(char, char)> fifth(fn_pt);

基本操作

    //=========================
    //  1. 输出所有 Pair 元素
    //=========================
    // 迭代器遍历 map
    for (it; it != mymap.end(); it++)
    {
        // map的迭代器,可以用 first 访问std::pair的第一个成员(Type1),second 访问第二个成员 (Type2)
        cout<<it->first<<":"<<it->second<<endl;
    }
    cout<<"================================="<<endl;

    //=========================
    //  2. 修改映射值
    //=========================
    second.clear();
    second['a']=1002;
    second['b']=10023;
    while (!second.empty())
    {
        cout << second.begin()->first << " => ";
        cout << second.begin()->second << endl;
        second.erase(second.begin());
    }
    cout<<"================================="<<endl;

    //=========================
    //  3. 插入
    //=========================
    mymap.insert(pair<char,int>('f',100) );
    mymap.insert(pair<char,int>('g',200) );
    cout<<"f => " <<mymap.find('f')->second<<endl;
    cout<<"g => " <<mymap.find('g')->second<<endl;

    cout<<"================================="<<endl;

    //=========================
    //  4. Compare 参数的使用
    //=========================
    key_comp = mymap.key_comp();
    cout << "mymap contains:\n";

    // 迭代器反向遍历的起始位置
    char highest = mymap.rbegin()->first;     // key value of last element
    it = mymap.begin();
    do {
        cout << (*it).first << " => " << (*it).second << endl;
    } while ( key_comp((*it++).first, highest) );

    cout << endl;
    return 0;

如果想看看某个存不存在某个key,可以用count来判断

if (m1.count("Lee"))
{
    cout << "Lee is in m1!" << endl;
}
else
{
    cout << "Lee do not exist!" << endl;
}

用erase完成删除操作

m1.erase("Curry");//通过关键字来删除

查找某个键值对

// 关键字查询,找到则返回指向该关键字的迭代器,否则返回指向end的迭代器
// 根据map的类型,返回的迭代器为 iterator 或者 const_iterator
if(map.find(a)!=map.end())
{...}
//以上表示找到了a,执行代码块
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值