从C学C++(10)-string/vector/map的简单使用

从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);
相关推荐
草莓熊Lotso8 分钟前
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day2
c语言·经验分享·笔记·其他
啊阿狸不会拉杆10 分钟前
《算法导论》第 21 章-用于不相交集合的数据结构
数据结构·c++·算法·随机森林
gmmi15 分钟前
文件IO(1)
c语言
愿天堂没有C++23 分钟前
C++——高性能组件
开发语言·c++·windows
CodeCraft Studio1 小时前
3D文档控件Aspose.3D实用教程:在 C# 中将 3MF 文件转换为 STL
c++·3d·c#
歆晨技术笔记2 小时前
开源项目 - 基于 C++ 实现沪深交易所流式二进制协议
c++
Nuyoah11klay2 小时前
华清远见25072班C语言学习day7
c语言·排序算法
草莓熊Lotso2 小时前
《吃透 C++ 类和对象(上):封装、实例化与 this 指针详解》
开发语言·c++·经验分享·笔记·其他
·前路漫漫亦灿灿3 小时前
C++11-下
开发语言·c++