string类
string的接口
#include<stdio.h>
#include<iostream>
using namespace std;
void test()
{
string str;//创建一个空的字符串
string copy(str);//复制一个字符串
string str2("abc");//创建一个字符串
string substr(str2, 1, 2);//从1位置取出str2的2个字符
string str3("12345678", 5);//取出字符串的前5个字符
string str4(10, 'a');//创建一个字符有10个a
string str5 = "abcde";//单参构造的隐式类型转换
}
int main()
{
test();
return 0;
}
void test1()
{
const string str = "12345";
//const对象,调用的接口为:const char& operator[](size_t pos)const
string str2 = "12345";
//非const对象调用的接口为:char& operator[](size_t pos)
char ch = str[3];
//str[3] = 'a';//错误,因为str是const对象,只能读不能写
char ch2 = str2[3];
str2[3] = '1';//也可写为str2.at(3) = '1';
}
迭代器:
是一种设计模式,如果要访问元素可以通过迭代器来进行访问。优点:所有容器都需要遵循相同的设计规范,所有容器迭代器的使用方式都是相同的。
迭代器的使用方式:
和指针类似。
设计规范:
1.begin迭代器:指向第一个元素的位置,通过解引用这个迭代器即可得到第一个元素
2.end迭代器:指向最后一个元素的后一个位置(注意不是指向最后一个元素)即左闭右开
3.访问数据:通过解引用完成 “*” 或者“->”
4.迭代器移动:++移动到下一个元素的位置,–移动到上一个元素的位置
5.位置的判断:支持!=,==
有些容器具有反向迭代器,在反向迭代器中有以下操作
6.rbegin迭代器:指向最后一个元素的位置
7.rend迭代器:指向第一个元素的前一个位置(注意不是指向第一个元素)即左闭右开
正向迭代器的演示
void testiterator()
{
string str = "12345";
string::iterator it = str.begin();//设置起始位置的迭代器为it
for (; it != str.end(); it++)//当it没有移动到最后一个元素的后一个位置时
{
cout << *it << endl;//对迭代器进行解引用获取元素
}
}
void testiterator()
{
string str = "12345";
string::iterator it = str.begin();//设置起始位置的迭代器为it
for (; it != str.end(); it++)//当it没有移动到最后一个元素的后一个位置时
{
cout << *it << endl;//对迭代器进行解引用获取元素
*it = 'a';//通过迭代器进行内容的修改,但如果是const string str,则不能修改
}
const string str2 = "abcd";
string::const_iterator it2 = str2.begin();//str2的内容不能被修改
}
反向迭代器
void testriterator()
{
string str = "12345";
string::reverse_iterator it = str.rbegin();
while (it != str.rend())
{
cout << *it << endl;
++it;//反向移动,向前移动
}
}
void test()
{
//范围for循环:可以访问范围确定的序列
//int arr[] = { 1,2,3,4,5 };
//for (const auto&e : arr)
//{
// cout << e << "";
//}
//cout << endl;
//范围for实际上是通过迭代器来实现的
//支持迭代器访问的自定义类型都可以支持范围for
string str = "12345";
for (auto& ch : str)
{
cout << ch << " ";
}
}
总结:
string的访问方式有三种:
1.for循环+operator[]
2.迭代器
3.范围for
这三种方式都可以修改内容
resize接口
void testresize()
{
string str;
cout << str.size() << endl;
str.resize(10);//resize,修改有效字符的个数
cout << str.size() << endl;
}
void testresize()
{
string str = "123";
str.resize(2);//str = "12"
str.resize(4, 'a');//str = "12aa"
}
总结:
resize(n):如果有效字符的个数增加,则新增的位置填充’\0’
resize(n,ch):如果有效字符的个数增加,则新增的位置填充ch
如果有效字符的个数减小,不会进行填充
capacity接口
void testcapacity()
{
string str = "123";
int cap = str.capacity();//当前str中可以存放元素的个数
}
void testcapacity()
{
string str = "123";
int cap = str.capacity();//当前str中可以存放元素的个数
str.resize(20);//size大于capacity时,capacity也发生变换
cap = str.capacity();
}
void testcapacity()
{
string str = "123";
int cap = str.capacity();//当前str中可以存放元素的个数
str.resize(20);
cap = str.capacity();
//reserve,修改容量,只能增加容量,不影响size
str.reserve(40);
cap = str.capacity();
}
一开始capacity是15是因为底层有16个空间,最后一个空间要放’\0’;
增容的规则是按1.5倍增长。
clear接口
void testcapacity()
{
string str = "123";
int cap = str.capacity();//当前str中可以存放元素的个数
str.resize(20);
cap = str.capacity();
//reserve,修改容量,只能增加容量,不影响size
str.reserve(40);
cap = str.capacity();
//clear:清空有效字符,只影响size
str.clear();
int sz = str.size();
cap = str.capacity();
}
void testcz()
{
string str = "123";
int sz = str.size();
int cap = str.capacity();
str.reserve(100);
str.shrink_to_fit();//将capacity与size相匹配,不一定是一样的值,量级匹配即可
sz = str.size();
cap = str.capacity();
}
+=接口
void testp()
{
string str;
string str2 = "123";
str += str2;//123
str += str2;//123123
str += '4';//1231234,简写
str.operator+=('5');//12312345,标准形式
}
append接口
void test()
{
string str;
string str2 = "123";
str.append(str2);//123
str.append(str2, 1, 1);//1232
str.append("abc");//1232abc
str.append("123456", 4);//1232abc1234
str.append(5, 'n');//1232abc1234nnnnn
char arr[] = "abcde";
str.append(arr, arr + sizeof(arr) / sizeof(arr[0]));//1232abc1234nnnnnabcde\0
str.append(str2.begin(), str2.end());//1232abc1234nnnnnabcde\0123
str.append("12345", 1, 2);//1232abc1234nnnnnabcde\012323
}
assign接口
赋值
void test1()
{
string str;
string str2 = "123";
str.assign(str2);//123
str.assign(str2, 1, 1);//2
str.assign("abc");//abc
str.assign("abcde", 2);//ab
str.assign(5, 'a');//aaaaa
str.assign(++str2.begin(), str2.end());//23
str.assign("abcd", 1, 2);//bc
}
insert接口
void test2()
{
string str = "123";
string str2 = "abc";
str.insert(0, str2);//在第0个位置前面插入str2,abc123
str.insert(4, str2, 1, 2);//从第4个位置开始插入str2的第1个位置开始的2个字符,abc1bc23
str.insert(str.size(), "abc");//abc1bc23abc
str.insert(5, "12345", 4);//abc1b1234c23abc
str.insert(str.begin(), 2, '0');//00abc1b1234c23abc
str.insert(str.end(), str2.begin(), str2.end());
}
push_back接口
void test()
{
string str;
str.push_back('1');//在str后插1
}
pop_back接口
void test2()
{
string str = "1234";
str.pop_back();
}
c_str接口
void test2()
{
const char* A;
string str = "1234";
A = str.c_str();//c_str:返回一个const char类型的指针,该指针指向str
cout << A << endl;
str = "abcd";
cout << A << endl;
}
find接口
void test()
{
string str = "123";
size_t pos = str.find('2');//从头开始向后找字符2,找到后返回字符2所在的位置
}
void test()
{
string str = "123456";
size_t pos = str.find('3',3);//从3位置开始向后找字符3,找到后返回字符3所在的位置,找不到则返回4G
}
rfind接口
void test()
{
string str = "123456";
size_t pos = str.rfind('3',3);//从3位置开始,向前找字符3,找到后返回字符3所在的位置
}
substr接口
void test()
{
string str = "123456";
string str2 = str.substr(2, 2);//从str的2位置开始,复制两个元素,返回一个string类。
//当第二个参数为负数时,默认从2位置开始取所有字符
}
将substr接口,find接口联合使用可以获得文件的后缀以及域名
void test()
{
string str = "string.cpp";
size_t pos = str.find('.');
string str2 = str.substr(pos, str.size() - pos);
}
void test()
{
string str = "https://editor.csdn.net/md?articleId=117331259";
size_t pos = str.find("://");
size_t end = str.find("/", pos + 3);//找到下一个'/'
string str2 = str.substr(pos+3, end - pos-3);//复制pos和end之间的域名
}
find_first_of接口
void test()
{
string str = "abcdefgbc";
size_t pos = str.find_first_of("bc",0);//从0位置开始在str内找和bc匹配的字符串,找到后返回该子串的起始位置
}
find_last_of接口
void test()
{
string str = "abcdefgbc";
size_t pos = str.find_first_of("bc",0);
size_t end = str.find_last_of("bc");//从后往前找和bc匹配的字符串,找到后返回该子串的最后一个字符的位置
}
find_first_not_of接口
void test()
{
string str = "abcdefgbc";
size_t pos = str.find_first_not_of("bc",0);//找到str中不和bc匹配的字符的第一个位置
size_t pos1 = str.find_first_not_of("bc", 1);//从位置1开始找到str中不和bc匹配的字符的第一个位置
}
find_last_not_of接口
void test()
{
string str = "abcdefgbc";
size_t end = str.find_last_not_of("bc");//找到str中不和bc匹配的字符串的最后一个字符位置
string str2 = "abcderbcjj";
size_t end1 = str2.find_last_not_of("bc");
}
+接口
void test1()
{
string str = "123";
string str2 = "456";
string str3 = str + str2;
}
cin:遇到空格/换行结束
cin>>str2;
getline:遇到换行结束
getline(cin,str2);
void test1()
{
string str = "123";
string str2 = "abc";
cin >> str2;
getline(cin, str);
}
可以看到第一次输入abc空格后cin就结束了,后面的字符是输入str的值,遇到空格不会结束。
还可以自己提供一个结束符
void test1()
{
string str = "123";
string str2 = "abc";
cin >> str2;
getline(cin, str, ',');//此时遇到,才结束
}
可以看到换行也会被输入进str内,‘,’后的a没有被输入进去
比较接口
void test()
{
string str = "123445";
string str2 = "ab";
//比较:按照每一个字符的ASCII码值进行比较
bool ret = str == str2;
ret = str > str2;
ret = str2 > str;
}