从C学C++(10)-string/vector/map的简单使用
String
string简介
- string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,、以及提供各种有用的操作
- string 是一个模板,在
<string>
这个头文件中有如下的定义:typedef basic_string<char> string;
常用字符串typedef basic_string<wchar_t> wstring;
等宽字符串
- 要使用string类型对象,必须包含相关头文件
#include <string>
string对象的定义和初始化
因为string头文件中重载了多种形式的string的构造函数, 比较常用的有以下几种:
- 默认构造函数, 默认值为空串
string s1;
- 用字符串(char*) 创建一个string对象
string s2("sheep")
- 指定字符和字符个数,创建一个string对象
string s3(n,'c')
,s3
是n个'c'字符组成的字符串。
常用成员函数
成员函数 | 描述 |
---|---|
size() |
返回字符串的大小 |
length() |
跟size() 一样,返回字符串的大小 |
begin()/end() |
返回的是一个迭代器对象,在这里可以暂时理解为(约等于)字符串的指针。 |
empty() |
判断是否为空字符串 |
substr() |
截取字串 (有多个重载,可以指定从多少offset开始截取) |
find() |
在字符串中查找指定字符或者字符串 (同样有多个重载,可以指定查找offset, 返回值是查找的字符(串)在对象字符串中的index) |
rfind() |
功能与find() 类似,不过是反向查找(从最后一个字符往前查找)。 |
replace() |
替代对象字符串中部分字符和字符串 (指定区间时是左闭右开的区间[) , string::npos 为库中的一个常量,为-1,可用于表示字符串结束的index) |
compare() |
比较字符串 (有多个重载,可以指定从多少offset开始比较) |
insert() |
插入字符(串) (有多个重载,可以指定从多少offset开始插入) |
append() |
在字符串后面追加字符串(也可以使用+= 的重载) |
swap() |
交换字符串的内容 |
find_first_of() |
在对象的字符串中寻找 有参数字符串的字符出现 的第一个位置 (有多个重载,可以指定从多少offset开始寻找, 对应的还有一个find_first_not_of() ) |
find_last_of() |
在对象的字符串中寻找 有参数字符串的字符出现 的最后一个位置 (有多个重载,可以指定从多少offset开始寻找 对应的还有一个find_last_not_of() ) |
vector
vector简介
- vector是同一种类型的对象的集合(也是一个模板类class template)
- vector的数据结构很像数组,能非常高效和方便地访问单个元素
- 要使用vector必须包含相关头文件
include <vector>
vector对象初始化
vector初始化时需要指定元素的类型,形式如下:
c++
vector<int> v; //声明了一个元素为int的向量
vector常用成员函数
成员函数 | 功能描述 |
---|---|
size() |
返回向量内的元素的个数 |
clear() |
清除所有元素 |
empty() |
判断是否为空 |
push_back() |
在末尾添加一个元素 |
pop_back() |
删除最后一个元素 |
erase() |
删除某一个元素 |
insert() |
插入一个元素 |
[] |
返回这个索引的元素 |
使用迭代器遍历的例子
c++
vector<int> v;
vector<int>:: const_iterator it; //模板类中一个迭代器类
for(it = v.begin(); it != v.end(); ++it)
//这里使用++it,不是使用it++;上次自己实现后置++时,就知道,后置++有临时对象的创建和赋值,相比之下前置++节约性能
{ //这里it这个迭代器可以暂时认为是元素的指针,
cout<<*it<<endl; //这里打印做一个演示
}
如果是要找到某个元素删除,可以按照以下代码遍历
c++
vector<int> v;
vector<int>:: const_iterator it; //模板类中一个迭代器类
for(it = v.begin(); it != v.end(); )
{
if(*it == 3){
it = v.erase(it);
//这里不能像之前一样++it;因为it已经从向量中删除了
//erase会把下一个元素对象的引用返回,所以直接接收
}else{
++it;
}
}
map
map介绍
-
map是一种类似键值对(key-value)列表(像python中的字典)的模板类
-
使用时需要包含头文件
<map>
-
定义map对象时需要指定键值的类型 如下:
map<string,int> map_tets;
定义了一个键为string类型,值为int类型的键值对列表对象。 -
由于内部实现是以红黑树实现的(查找复杂度为O(log2N)O(log_2N)O(log2N)),所以对键的类型有一定要求,因为内部默认是按从小到大排序的,所以,键的类型需要重载
<
小于的运算符。如果在初始化时指定内部从大到小排序的话,就需要键的类型重载
>
运算符
增删查改操作
(增)插入数据
-
直接使用
[]
方式插入:c++map_test["aaa"] = 100;
直接使用
[]
重载的运算符插入,这个插入方式也是支持修改已有键的值的操作。其余以下的插入方法在已有键存在的情况下,将会插入失败,不会改编键值。
-
调用成员函数
insert
插入:c++map_test.insert(map<string,int>::value_type("bbb",200)); //这里的map<string,int>::value_type这个类型,实际上是map中单个键值对的类型, //所以这里是构造了单个键值对的类型的一个对象来插入 map_test.insert(pair<string,int>("ddd",400)); //和上面一样,构造了单个键值对的类型的一个对象来插入 map_test.insert(make_pair<string,int>("ccc",200)); //这里是调用了一个函数来生成一个键值对类型插入
(查改)数据
-
使用
[]
操作(如上面所说)c++map_test["aaa"] = 10;
-
使用迭代器用于存放单个键值对
c++map<string, int>:: iterator it map_test.find("ddd"); //使用find成员函数找出对应键值对,用迭代器对象it存放 it->second = 666; //修改键值 //it->first 是键,it->second是值
(删)除数据
-
使用
erase()
成员函数即可,参数可为迭代器对象或者键c++map_test.erase("aaa");//删除对应键值 //使用上面查找得到的迭代器对象进行删除 map_test.erase(it);