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可以使两个容器互换,可以达到内存收缩的效果 。