1.1 C语言中的字符串
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,
但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可
能还会越界访问。
string的文档
自动调用;不用写;
上面讲了非const的正反迭代器;
下面我将讲诉const的正反迭代器;
当对象的begin是const类型时;
就要使用const迭代器;
正序:
倒序:
注意:迭代器可以用于所有数据结构的遍历;
方法1:使用[]来遍历字符串;
方法2:迭代器begin和end
迭代器的使用:
类模板+::+iterator+名字;
这里的迭代器可以想想为指针;
方法3:迭代器 rbegin和rend(反向遍历)
这里2和3的类型名过长;可以使用auto类型
auto可以直接i将等号后面的类型拷贝到等号前的类型中;
方法4:使用范围for(c++的for循环的简写)
for (auto ch : s1)//这里的s1是数据结构
{
cout << ch << "";
}
cout << endl;
范围for会将s1的所有数据依次传递给ch;直到运输完;
这里范围for的本质就是迭代器:原理范围for将编译器改为迭代器来使用;本质与第2个相同;这里的不支持倒着遍历;
size_t size() const;
**作用:**字符串的大小;
string先创造出来;stl后创造出来;
string先创作了length()来计算字符串的长度;stl创造了size()来计算数据结构的大小;string就将length用size替代;
这里字符串的/0是为了兼容c语言;
size_t capacity() const;
作用:调用返回字符串的容量;
清空内存;
作用:为string预留空间,不改变有效元素个数,
注意区别reserve和reverse(别写错了)
reserve——保留
reverse——反转
当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小;
void resize(size_t n)
void resize (size_t n,char c)
相同点:
两者都是将字符串中的有效字符改变到n个,
不同:
当字符个数增加时;resize(n)用/0来填充多出的元素;resize(size_t n,char c)用字符c来填充多出的元素空间。
n大小不同的情况
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
获取字符串的字符;
返回对字符串中位置的字符的引用。
例子
// string::operator[]
#include
#include
int main ()
{
std::string str ("Test string");
for (int i=0; i<str.length(); ++i)
{
std::cout << str[i];
}
return 0;
}
char& at (size_t pos);
const char& at (size_t pos) const;
与【】的作用相同都是获取字符串的字符;
返回对i字符串中位置的引用;
【】越界直接断言;
at 越界抛异常;
由于append和push_back的函数种类过于繁琐;使用较少;所以使用时请自行查找;
string (1)
string& operator+= (const string& str);
c-string (2)
string& operator+= (const char* s);
character (3)
string& operator+= (char c);
string (1)
string operator+ (const string& lhs, const string& rhs);
c-string (2)
string operator+ (const string& lhs, const char* rhs);string operator+ (const char* lhs, const string& rhs);
character (3)
string operator+ (const string& lhs, char rhs);string operator+ (char lhs, const string& rhs);
例子:
+相比+=返回值是值传递需要多次拷贝构造函数;复杂度较高;
所以建议减少使用+;
+函数的原理
string (1)
string& assign (const string& str);
substring (2)
string& assign (const string& str, size_t subpos, size_t sublen);
c-string (3)
string& assign (const char* s);
buffer (4)
string& assign (const char* s, size_t n);
fill (5)
string& assign (size_t n, char c);
range (6)
template <class InputIterator> string& assign (InputIterator first, InputIterator last);
string& insert (size_t pos, const string& str);
substring (2)
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
c-string (3)
string& insert (size_t pos, const char* s);
buffer (4)
string& insert (size_t pos, const char* s, size_t n);
fill (5)
string& insert (size_t pos, size_t n, char c);
void insert (iterator p, size_t n, char c);
single character (6)
iterator insert (iterator p, char c);
range (7)
template <class InputIterator> void insert (iterator p, InputIterator first, InputIterator last);
由上面的函数声明;可以判断头插;只有两种类型;6和5都可以是实现;
示例
头插经量减少使用;因为要挪动数据;
sequence (1)
//删除
string& erase (size_t pos = 0, size_t len = npos);
这里的pos是删除的前指针;len是删除的尾指针;
这里的指针默认字符串的末尾;
例子
string (1)
string& replace (size_t pos, size_t len, const string& str);string& replace (iterator i1, iterator i2, const string& str);
substring (2)
string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
c-string (3)
string& replace (size_t pos, size_t len, const char* s);string& replace (iterator i1, iterator i2, const char* s);
buffer (4)
string& replace (size_t pos, size_t len, const char* s, size_t n);string& replace (iterator i1, iterator i2, const char* s, size_t n);
fill (5)
string& replace (size_t pos, size_t len, size_t n, char c);string& replace (iterator i1, iterator i2, size_t n, char c);
range (6)
template <class InputIterator> string& replace (iterator i1, iterator i2, InputIterator first, InputIterator last);
举例:
单个替换
string& replace (size_t pos, size_t len, const string& str);
pos是起始位置;
len是替换的长度;
str是替换的字符串;
这里的空间变大;设计挪动数据;
尽量不要使用;原因:都涉及数据的移动;复杂度较高;
接口设计复杂繁多,需要时擦一下文档即可;
多个替换
1.可使用其他数组类替换掉
2.只允许在本数组中进行替换
这里有三种方法:
1和2是赋值法:这里的复杂度还可以(只调用一次拷贝构造函数)
3.由于交换(全局函数)需要创建变量并进行三次拷贝构造函数;
补:swap成员函数;
const char* data() const;
返回值是c语言的字符串的首地址;
例子:
// string::data
#include
#include
#include
int main ()
{
int length;
std::string str = "Test string";
char* cstr = "Test string";
if ( str.length() == std::strlen(cstr) )
{
std::cout << "str and cstr have the same length.\n";
if ( memcmp (cstr, str.data(), str.length() ) == 0 )
std::cout << "str and cstr have the same content.\n";
}
return 0;
}
string (1)
size_t find (const string& str, size_t pos = 0) const;
c-string (2)
size_t find (const char* s, size_t pos = 0) const;
buffer (3)
size_t find (const char* s, size_t pos, size_t n) const;
character (4)
size_t find (char c, size_t pos = 0) const;
Find content in string(这里找到是出现的第一个位置)
这由于pos有缺失参数;所以不用写初始位置;
string (1)
size_t rfind (const string& str, size_t pos = npos) const;
c-string (2)
size_t rfind (const char* s, size_t pos = npos) const;
buffer (3)
size_t rfind (const char* s, size_t pos, size_t n) const;
character (4)
size_t rfind (char c, size_t pos = npos) const;
Find last occurrence of content in string (public member function)(这里找到是出现的最后位置)
string substr (size_t pos = 0, size_t len = npos) const;
这里是将字符串的一部分输出;
pos是起始位置;npos输出的个数;
补充
算个数的方法:j将数据i想象为左闭右开的数据;数据个数:左数据下标-右数据下标;
string (1)
size_t find_first_of (const string& str, size_t pos = 0) const;
c-string (2)
size_t find_first_of (const char* s, size_t pos = 0) const;
buffer (3)
size_t find_first_of (const char* s, size_t pos, size_t n) const;
character (4)
size_t find_first_of (char c, size_t pos = 0) const;
size_t find_first_of (const char s, size_t pos = 0) const;*
这个函数的作用在str(从前往后)中找s中的元素(s不按顺序)只要和”s“中的一样就算找到,
string (1)
size_t find_last_of (const string& str, size_t pos = npos) const;
c-string (2)
size_t find_last_of (const char* s, size_t pos = npos) const;
buffer (3)
size_t find_last_of (const char* s, size_t pos, size_t n) const;
character (4)
size_t find_last_of (char c, size_t pos = npos) const;
这个函数的作用在str(从后往前)中找s中的元素(s不按顺序)只要和”s“中的一样就算找到,
string (1)
size_t find_first_not_of (const string& str, size_t pos = 0) const;
c-string (2)
size_t find_first_not_of (const char* s, size_t pos = 0) const;
buffer (3)
size_t find_first_not_of (const char* s, size_t pos, size_t n) const;
character (4)
size_t find_first_not_of (char c, size_t pos = 0) const;
这个函数的作用在str(从前往后)中找s中的不存在的元素(s不按顺序)只要和”s“中的一样就算找到。
string (1)
size_t find_last_not_of (const string& str, size_t pos = npos) const;
c-string (2)
size_t find_last_not_of (const char* s, size_t pos = npos) const;
buffer (3)
size_t find_last_not_of (const char* s, size_t pos, size_t n) const;
character (4)
size_t find_last_not_of (char c, size_t pos = npos) const;
这个函数的作用在str(从前往后)中找s中的不存在的元素(s不按顺序)只要和”s“中的一样就算找到。