string是一个类,内部封装了char*,用来管理这个容器
string类中封装了很多的功能函数,如:find、copy、delete、replace、insert等
不用考虑内存释放和越界问题。
string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心赋值越界取值越界等。
string构造函数
string();//创建一个空字符串 例如:string str;
string(const string& str);//使用一个string对象初始化另一个string对象
string(const char* s);//使用字符串s初始化
string(int n, char c);//使用n个字符c初始化
//string的构造
void test06() {
//无参构造,创建一个空字符串""
string str = string();
//通过一个字符串,构造另外一个字符串
string str2 = string("hello world");
//通过一个字符数组,构造一个字符串
const char* array = "hello world";
string str3 = string(str2);
cout << str3 << endl;
//通过指定数量的指定字符,构造一个字符串"AAAA"
string str4 = string(5, 'A');
cout << str4 << endl;
}
int main() {
test06();
system("pause");
return 0;
}
string基本赋值操作
string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);//把字符串s付给当前字符串
stirng& operator=(char c);//字符赋给当前的字符串
string& assign(const char *s);//把字符串s赋值给当前的字符串
string& assign(const char *s, int n);//把字符串s前n个字符赋给当前的字符串
string& assign(const string &s);//把字符串s赋值给当前的字符串
string& assign(int n, char c);//用n个字符c赋给当前字符串
string& assign(const char *s);//将s从start开始n个字符赋值给字符串
void test07() {
string str;
//通过=等号进行赋值,等号已经被string进行了运算符重载
//通过字符串进行赋值
str = "hello world";
//通过字符数组进行赋值
const char* arr = "abc";
str = arr;
cout << str << endl;
//通过字符进行赋值
str = 'a';
cout << str << endl;
//assign
str.assign("hello world");
cout << str << endl;
str.assign(arr);
cout << str << endl;
str.assign(8,'a');
cout << str << endl;
}
string存取字符
char& operator[](int n);//通过[]方式取字符
char& at(int n);//通过at方法获取字符
//string的存取字符
void test08() {
//通过"下标",从一个字符串中获取到指定位的字符,或者是可以修改指定下标位的字符。
//char& operator[](int n);//通过[]方式取字符
//char& at(int n);//通过at方法获取字符
string str = "hello world";
cout << str[4] << endl;
cout << str.at(4) << endl;
//使用字符引用返回值,存储一下字符串中指定下标位字符的引用
char& c = str[4];
//修改引用的值,因为这里引用的是字符数组中的指定下标位的元素,所以这里c发生变更,也会影响到数组中的元素
c = '!';
cout << str << endl;
//注意事项
// 一旦字符串中的字符数组内存重新分配了,使之前的引用再进行空间访问,可能会出现问题
//16位
//c_str:将C++风格的字符串,转成C风格的字符串(返回C++的string类中维护的那个字符数组指针)
cout << (int*)str.c_str() << endl;
str = "123456789012345";
cout << (int*)str.c_str() << endl;
}
string拼接
string& operator+=(const string& str);//重载+=操作符
string& operator+=(const char* str);//重载+=操作符
string& operator+=(const char c);//重载+=操作符
string& append(const char *s);//把字符串s连接到当前字符串结尾
string& append(const char *s, int n);//把字符串s的前面n个字符连接到当前字符串结尾
string& append(const string &s);//同operator+=()
string& append(const string &s, int pos, int n);
//把字符串s中从pos开始的你个字符连接到当前字符串结尾
string& append(int n, char c);//在当前字符串结尾添加n个字符c
//string拼接
void test09() {
string str = "hello";
//+
//string str1 = str + "world";
//cout<
//+=
//str += "world";
//cout << str << endl;
//append
//string& append(const char* s);//把字符串s连接到当前字符串结尾
str.append(" world");
cout << str << endl;//hello world
//string& append(const char* s, int n);//把字符串s的前面n个字符连接到当前字符串结尾
str.append(" nihao", 3);
cout << str << endl;//hello world ni
//string& append(const string & s);//同operator+=()
//string& append(const string & s, int pos, int n);//把字符串s中从pos开始的你个字符连接到当前字符串结尾
str.append("java is the best programming language", 11, 4);
cout << str << endl;//hello world ni bes
//string& append(int n, char c);//在当前字符串结尾添加n个字符c
str.append(5, 'K');
cout << str << endl//hello world ni besKKKKK;
}
string查找和替换
int find(const string& str, int pos = 0) const;//查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const;//查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const;//从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos = 0) const;//查找字符c第一次出现位置
int rfind(const string& str, int pos = npos) const;//查找str最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos = npos) const;//查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const;//从pos查找s的前n个字符最后一次位置
int rfind(const char c, int pos = 0) const;//查找字符c最后一次出现位置
string& replace(int pos, int n, const string& str);//替换从pos开始n个字符为字符串str
string& replace(int pos, int n, const char* s);//替换从pos开始n个字符为字符串s
//string的查找和替换
void test10() {
//查找:查找一个字符串或者是一个字符,在指定的字符串中出现的下标,如果找不到返回-1
//替换:将一个字符串中指定下标范围替换成新字符串
string str = "C++ is the most popular, most usful programing language in the world";
//查找
//int find(const string & str, int pos = 0) const;//查找str第一次出现位置,从pos开始查找
//int find(const char* s, int pos = 0) const;//查找s第一次出现位置,从pos开始查找
//int find(const char* s, int pos, int n) const;//从pos位置查找s的前n个字符第一次位置
//int find(const char c, int pos = 0) const;//查找字符c第一次出现位置
cout << str.find("most") << endl;
cout << str.find("most", 20) << endl;
int res = str.find("mostmost", 0, 4);
cout << res << endl;
cout << str.find('s') << endl;
//int rfind(const string & str, int pos = npos) const;//查找str最后一次出现位置,从pos开始查找从后往前遍历
//int rfind(const char* s, int pos = npos) const;//查找s最后一次出现位置,从pos开始查找
//int rfind(const char* s, int pos, int n) const;//从pos查找s的前n个字符最后一次位置
//int rfind(const char c, int pos = 0) const;//查找字符c最后一次出现位置
cout << str.rfind("most",20) << endl;
//替换
//string& replace(int pos, int n, const string & str);//替换从pos开始n个字符为字符串str
//string& replace(int pos, int n, const char* s);//替换从pos开始n个字符为字符串s
cout << str.replace(11, 24, "best") << endl;//C++ is the best programing language in the world
cout << str << endl;//C++ is the best programing language in the world
}
string比较操作
/*
compare函数在>时返回1,<时返回-1,==时返回0.
比较区分大小写,比较时参考字典顺序,排越前面的越小。
大写的A比小写的a小。
*/
int compare(const string &s)const;//与字符串s比较
int compare(const char *s)const;//与字符串s比较
//sring的比较操作
void test11() {
//字符传大小比较规则:比较的是字典顺序(更深入来说,就是字符在在字符集中映射的数字)
//
//一次比较字符串中的每一位字符,如果字符相同,继续比较后面的一位字符。直到某一次的比较可以分出大小。
//字符串可用><>=<===!=来比较
// 局限性:比较的结果是布尔类型,无法充足的表示每一种比较结果
// 因此字符串提供compare函数,返回值是一个int类型
// 1:前面的大于后面的
// -1:前面的小于后面的
// 0:相等
string str1 = "abc";
string str2 = "abc";
//cout << (str1 < str2) << endl;
cout << str1.compare(str2) << endl;
}
string字串的获取
string substr(int pos = 0, int n = npos) const;//返回由pos开始的n个字符串组成的字符串
string插入和删除操作
string& insert(int pos, const char* s);//插入字符串
string& insert(int pos, const string& str);//插入字符串
string& insert(int pos, int n, char c);//在指定位置插入n个字符c
string& erase(int pos, int n = npos);//删除从pos开始的n个字符
string和C语言风格字符串转换
//stirng转char*
string str = "itcast";
const char* cstr = str.c_str();
//char* 转string
char* s = "itcast";
string str(s);
在C++中存在一个从const char到string的隐式类型转换,却不存在从一个string对象到Cstring的自动类型转换。对于string类型的字符串,可以通过cstr()函数返回string对象对应的C_string. 通常,程序员在整个程序中应坚持使用string类对象,直到必须将内容转化为char时才将其转换为C_string.
//string的插入删除
//string& insert(int pos, const char* s);//插入字符串
//string& insert(int pos, const string& str);//插入字符串
//string& insert(int pos, int n, char c);//在指定位置插入n个字符c
//string& erase(int pos, int n = npos);//删除从pos开始的n个字符
void test13() {
string str = "HAHAHAHA";
str.insert(4, "hello");
cout << str << endl;
str.insert(4, 5, 'K');
cout << str << endl;
//删除
str.erase(4, 5);
cout << str << endl;
}
vector的数据安排及操作方式,与array非常相似,两者唯一差别在于空间的运用的灵活性。Array是静态控件,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据办网新空间,在释放原来的空间。Vector时动态空间,随着元素的加入,他的内部机制就会自动阔充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个大块头的array了。
//vector容器遍历
void test14() {
//1.构造一个vector对象 通过vector无参构造,构造空vector容器
vector<int> v;
//2.添加若干个元素
v.push_back(10);
v.push_back(20);
v.push_back(30);
//3.迭代器:使用普通指针 一次指向vector中每一个元素
//begin():获取到的是vector容器中的首元素的地址
//end():获取到的是vector容器中的最后一位元素的下一位的指针
/*vector::iterator it = v.begin();
cout << *it << endl;
it++;
cout << *it << endl;
it++;
cout << *it << endl;*/
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
//直接输出指针指向元素
//cout << *it << endl;
//可以通过指针,修改元素
if (*it == 20) {
*it = 200;
}
}
//使用迭代器遍历vector容器
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << endl;
}
//使用迭代器遍历容器的时候可以缩写
//一次将vector容器的每一个元素,给element赋值
for (int ele : v) {
if (ele == 200) {
ele = 2000;
}
}
for (int ele : v) {
cout << ele << endl;
}
for (int& ele : v) {
if (ele == 200) {
ele = 2000;
}
}
for (int ele : v) {
cout << ele << endl;
}
int a = 10;
int& b = a;//想通过b修改a加&
b = 100;
}
int main() {
test14();
system("pause");
return 0;
//倒序遍历vector
for (vector<int>::iterator it = v.end(); it != v.begin(); ) {
it--;
cout << *it << endl;
}
}
#include
using namespace std;
int main0() {
system("pause");
return 0;
}