2021年11月14日 C++ STL学习 string&&vector

 String

创建string

string s1;  "创建空字符串,调用无参构造函数"

const char* str = "hello world";
string s2(str);  "把c_string转换成了string"

string s3(s2);  "调用拷贝构造函数"

string s4(10, 'a');"初始化为10个'a'"

值得一提的是:C11之后,string末尾是有空字符 '\0'的,但是看你的编译器会不会帮你实现了。

 小结:()中就是你需要初始化的内容,可以是string、C风格字符串、“数字+单个字符”。


 赋值string

str1 = "hello world"; "使用=,直接字符串常量赋值"

str2 = str1;  "string之间相互赋值"

str3 = 'a';  "与第一行相似,不过这边只用单个字符"

str4.assign("hello c++"); "利用assign进行赋值,和第一行相似"

str5.assign("hello c++",5); 
"5表示从 hello c++ 拿出5个字符(注意这里的字符串只能是字符数组而不是string"

str6.assign(str1,4,3)"从string(不是字符数组而是string)中index为4的元素开始拿出3个元素"
{
    string str1, str2 = "War and Peace";
    str1.assign( str2, 4, 3 );  
    cout << str1 << endl;
    "输出"  
    and
}

str7.assign(str5); "同第二行"

str8.assign(5, 'x'); "第三行加强版"

小结:assign用的少,直接=进行赋值(初始化)就好了。 


String 的拼接

str1 += "爱玩游戏"; or str1 += ':';  "使用自增运算符,字符和字符串都可以"

str1 += str2;  "拼接其他的string"

str3.append(" love "); or str3.append(str2);   "直接添加字符串或者string"

str3.append("game abcde", 4);  "添加字符串 game abcde 中的4个字符"

str3.append(str2, 4, 3); "从下标4位置开始 ,截取3个字符,拼接到字符串末尾"

小结:自增+=和赋值=运算符用得比较多。 


 String 查找和替换

"从左边开始找"
find(const string& str, int pos = 0) ; "查找str第一次出现位置,默认从pos开始查找"

find(const char* s, int pos = 0) ; "查找s第一次出现位置,默认从pos开始查找"

find(const char* s, int pos, int n) ; "从pos位置查找s的前n个字符第一次位置"

find(const char c, int pos = 0) ;  "查找字符c第一次出现位置"

"从右边开始找"
rfind(const string& str, int pos = npos) ;  "查找str最后一次位置,从pos开始查找"

rfind(const char* s, int pos = npos) ;  "查找s最后一次出现位置,从pos开始查找"

rfind(const char* s, int pos, int n) ;  "从pos查找s的前n个字符最后一次位置"

rfind(const char c, int pos = 0) ;  "查找字符c最后一次出现位置"

"替换,字符串和string"
replace(int pos, int n, const string& str);  "替换从pos开始n个字符为字符串str"

replace(int pos, int n,const char* s); "替换从pos开始的n个字符为字符串s"

小结:一般就是find("搜索内容")就好了,可以省略掉第二个参数。其他用的少。

find查找是从左往后,

rfind从右往左 find找到字符串后返回查找的第一个字符位置,找不到返回-1

replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串 


String比较

compare(const string &s) ; "与字符串s比较"

compare(const char *s) ;  "与字符串s比较"

小结:字符串对比主要是用于比较两个字符串是否相等,判断谁大谁小的意义并不是很大 


string字符读取

str[0] = 'x'; "通过[]来访问"

str.at(1) = 'x'; "通过at()来访问"

 小结 :还是用[]吧哈哈哈。


 string的插入和删除

insert(int pos, const char* s);  "插入字符串"

insert(int pos, const string& str);  "插入字符串"

insert(int pos, int n, char c);  "在指定位置插入n个字符c"

erase(int pos, int n = npos);  "删除从Pos开始的n个字符"

小结:插入和删除的起始下标都是从0开始 。


 string字串

substr(int pos = 0, int n = npos) ; "返回由pos开始的n个字符组成的字符串"

"应用实例"
void test01()
{
    string email = "hello@sina.com";
    int pos = email.find("@"); "先找到目标位置"
    string username = email.substr(0, pos); "将@之前的文本全部切取出来"
    cout << "username: " << username << endl;
}

Vector

vector的迭代器

vector<int>::iterator it = v.begin();

vector的创建

vector<int> v1; "无参构造,空数组"

vector<int> v2(v1.begin(), v1.end()); "通过迭代器将某个v1的某个区间元素全部赋给v1"

vector<int> v3(10, 100);"将10个100赋值给v3,注意前面是个数,后面是元素"

vector<int> v4(v3);"v4和v3之间互相赋值"

小结:一般不初始化呵呵呵。 


Vector赋值操作

v2 = v1; "直接赋值"

v3.assign(v1.begin(), v1.end());

v4.assign(10, 100);

小结:assign用的还是少的,一般直接用 =来赋值。 


Vector容量大小

empty();  "判断容器是否为空"
capacity();  "容器的容量"
size();  "返回容器中元素的个数"
resize(int num);  "重新指定容器的长度为num,若容器变长,则以默认值填充新位置。"
                  "如果容器变短,则末尾超出容器长度的元素被删除。"
resize(int num, elem);  "重新指定容器的长度为num,若容器变长,则以elem值填充新位置。"
                        "如果容器变短,则末尾超出容器长度的元素被删除"

总结: 判断是否为空 --- empty

           返回元素个数 --- size

           返回容器容量 --- capacity

           重新指定大小 --- resize 


Vector 插入和删除

push_back(ele); "尾部插入元素ele"

pop_back(); "删除最后一个元素"

insert(const_iterator pos, ele);  "迭代器指向位置pos插入元素ele"

insert(const_iterator pos, int count,ele); "迭代器指向位置pos插入count个元素ele"

erase(const_iterator pos); "删除迭代器指向的元素"

erase(const_iterator start, const_iterator end);  "删除迭代器从start到end之间的元素"

clear();  "删除容器中所有元素"

小结:push_back(),和pop_back()用的多,其他用的好像不多??? 


Vector数据存取

at(int idx); "返回索引idx所指的数据"

[]; "返回索引idx所指的数据"

front(); "返回容器中第一个数据元素"

back(); "返回容器中最后一个数据元素"

小结:front()和back()用得比较多,用[]不用at()。


Vector互换

v1.swap(v2); "v1和v2互换"

小结:swap可以使两个容器互换,可以达到内存收缩的效果 。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值