C++ STL笔记(1.容器)

c++的STL基本用法。
C++ STL(Standard Template Library,即标准模板库)中最基本以及最常用的类或容器如下:

  • string
  • vector
  • set
  • list
  • map

STL的最主要的两个特点:数据结构和算法的分离,非面向对象本质。访问对象是通过象指针一样的迭代器实现的;容器是象链表,矢量之类的数据结构,并按模板方式提供;算法是函数模板,用于操作容器中的数据。由于STL以模板为基础,所以能用于任何数据类型和结构。

1.string( include <string>)

在c语言中,想要表示一个字符串有两种方法:
数组和指针,数组I/O繁琐,指针对于不熟练的人来说,会出现各式各样的错误,而string可以解决以上两点问题。

  • string的初始化
    在这里插入图片描述

  • string的操作
    在这里插入图片描述

  • string的IO操作 :
    a. getline来获取一整行内容:
    在上一条的操作中,尤其应注意getline(),如果同一行内有用空格分隔开的信息,就不能用cin输入了,cin将会将空格分开的看作两个部分,可以用getline()输入。
    b. 合并字符串时,’+‘号的运用
    当把string对象和字符面值及字符串面值混在一条语句中使用时,必须确保+的两侧的运算对象至少有一个是string
    string s1 = s2 + ", "; //正确
    string s3 = "s " + ", "; //错误
    string s4 = “hello” + ", " + s1; //错误
    string s5 = s1 + "hello " + ", "; //改一下顺序,s1放前头,正确了,注意理解=号右边的运算顺序

  • 处理string中的字符(访问字符串中每个字符)

方法一(类似数组):

for (int i = 0; i < s3.size(); i++)
{
    cout << s3[i] << endl;
    s3[i] = 's';
}

方法二(迭代器):

for (string::iterator it = str.begin(); it != str.end(); it++)
{
    cout << *it << endl;
}
  • string中的其他函数
string s;
s.find( string line );//查找字符串line在当前串中的位置
s.rfind( string line , int pos );//从pos开始从后向前查找字符串line在当前串中的位置
s.erase( int a , int b );//删除s串从a到b位置的内容

2.vector(include )

  • 初始化:vector<类型> 名字
    如果vector的元素类型是int,默认初始化为0;如果vector元素类型为string,则默认初始化为空字符串。
vector<int> v1;
vector<string> v3;
vector<vector<int> >;  //注意空格。这里相当于二维数组int a[n][n];
vector<int> v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括号
vector<string> v6 = { "hi","my","name","is","lee" };
vector<int> v7(5, -1); //初始化为-1,-1,-1,-1,-1。第一个参数是数目,第二个参数是要初始化的值
vector<string> v8(3, "hi");
vector<int> v9(10); //默认初始化为0
  • 基本操作
vector<int> v;
vector<int> v1;
vector<int> v2;
v.empty( ); //如果v中不含任何元素,返回真,否则返回假
v.size( );  //返回v中元素个数
v.push_back(t);  向v的尾端加入一个值为t的元素
v.pop_back(t);  删除v的尾端的元素
v[ n ];   //返回v中第n个位置上元素的引用
v1==v2; //当且仅当v1和v2元素数量相同且对应位置的元素值都相同时为真
v.erase( );//删除一个或多个元素
v.clear( );//删除所有元素

注意:只能对已存在的元素进行赋值或者修改操作,如果是要加入新元素,务必使用push_back。push_back的作用有两个:告诉编译器为新元素开辟空间、将新元素存入新空间里。

  • 遍历vector的元素
    方法一(类似数组):
for (int i = 0; i < v1.size(); i++)      cout << v1[i] << endl;

方法二(迭代器):
正向迭代:

for (vector<string>::iterator iter = v6.begin(); iter != v6.end(); iter++)
    cout << *iter << endl;

反向迭代:

for (vector<string>::reverse_iterator iter = v6.rbegin(); iter != v6.rend(); iter++)
    cout << *iter << endl;

3.set(include )
set跟vector差不多,它跟vector的唯一区别就是,set里面的元素是有序的且唯一的,只要你往set里添加元素,它就会自动排序(按字典序排序),而且,如果你添加的元素set里面本来就存在,那么这次添加操作就不执行.

set<int> s1{9,8,1,2,3,4,5,5,5,6,7,7 }; 
for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)
    {
        cout << *it<<" ";
    }

//运行结果:1 2 3 4 5 6 7 8 9    

4.list(include )
list即数据结构里所学的双向链表,优点是插入和删除元素都比较快捷,缺点是不能随机访问元素。有了list容器,我们就不用重复造轮子了,直接用即可。

  • 初始化
list<int> l1{ 1,2,3,4,5,5,6,7,7 };
list<double> l2;
list<char> l3(10);
list<int> l4(5, 10); //将元素都初始化为10,即此时list为10,10,10,10,10。5

5.map(include )
map运用了哈希表地址映射的思想,也就是key-value的思想,来实现的。

  • 初始化
    map<类型, 类型> mapStudent;

  • 插入元素

//1.用insert函數插入pair
    mapStudent.insert(pair<string, string>("r000", "student_zero"));
 
//2.用"array"方式插入
    mapStudent["r123"] = "student_first";
    mapStudent["r456"] = "student_second";
  • 查找元素
    1.用count判断
 map<string, int> m1;
if (m1.count("123"))
{
    cout << "123 is in m1!" << endl;
}
else
{
    cout << "123 do not exist!" << endl;
}

2.迭代器

for (map<string, int>::iterator it = m1.begin(); it != m1.end(); it++)
{
    cout << it->first<<"  "<<it->second << endl;  //注意用法,不是用*it来访问了。first表示的是key,second存的是value
}
  • 删除元素
//用关键字删除
m1.erase("Curry");//如果刪除了會返回1,否則返回0
//迭代器删除
iter = m1.find("r123"); m1.erase(iter); 
//清空map方法一(用迭代器)
 m1.erase(m1.begin(), m1.end()); 
//清空map方法二(用clear函数) 
m1.clear();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值