STLSTLSTL (最基础的数据结构)
字符串 STRINGSTRINGSTRING
头文件: stringstringstring
- 读入
使用 cincincin 读入时,遇到空白就停止读取。比如程序输入的是
hello world
那么我们得到的字符串是 hello
,而后面的空格以及 worldworldworld 就无法读出。
有时我们想把一整句话读入进来,又不想像上面那样创建无数个 stringstringstring 来保存单词,这是我们就用到了 getlinegetlinegetline 来获取一整行内容。
string str;
getline(cin, str);
- 处理字符串
- 当把 stringstringstring 对象和字符面值及字符串面值混在一条语句中使用时,必须确保 +++ 的两侧的运算对象至少有一个是 stringstringstring 。
string s1 = s2 + ", "; //正确 string s3 = "s " + ", "; //错误 string s4 = "hello" + ", " + s1; //错误 string s5 = s1 + "hello " + ", "; //改一下顺序,s1放前头,正确了,注意理解=号右边的运算顺序
- 访问字符串的每一个字符
for(int i = 0; i < s3.size(); i++) { cout << s3[i] << endl; s3[i] = 's'; }
- 在 C++C++C++ 中有一个神奇的东西叫做迭代器 iteratoriteratoriterator ,我们可以用它来访问容器元素。
string str("hi sysu"); for(string::iterator it = str.begin(); it != str.end(); it++) { cout << *it << endl; }
- 查找字串
string s("heoolo sdaa ss"); cout << s.find("aa", 0) << endl; //返回的是子串位置。第二个参数是查找的起始位置,如果找不到,就返回string::npos if(s.find("sa", 0) == string::npos) { cout << "找不到该子串!" << endl; }
- 字符串长度
//string类型 string str = "abcdef"; int a = str.length(); //char类型,strlen函数包含在 ·cstring· 头文件下 int len = strlen(c);
- cctypecctypecctype 头文件中好玩的东西
- 其他有意思的函数
- itoa():将整型值转换为字符串。
#include <cstdio>
#include <cstdlib>
int main() {
int num = 100;
char str[25];
itoa(num, str, 10); //num表示要操作的数字,str表示字符串,10表示数字的进制
printf("The number 'num' is %d and the string 'str' is %s. \n" , num, str);
}
itoa并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,请用sprintf。是Windows平台下扩展的,标准库中有sprintf,功能比这个更强,用法跟printf类似:
char str[255];
sprintf(str, "%x", 100); //将100转为16进制表示的字符串。
- ltoa():将长整型值转换为字符串。
- atoi():将字符串转换为整型值。
- atol():将字符串转换为长整型值。
VECTORVECTORVECTOR
头文件:vectorvectorvector
- 初始化
vector<类型> v
- 简单操作
- 添加元素 v.push_back
使用 v.push_back 加入元素,并且这个元素是加在数组末尾的。
for(int i = 1; i <= n; i++) { v.push_back(i); }
- v.empty()
如果 vvv 中不包含任何元素,返回真;否则返回假。 - v.size()
返回 vvv 中元素的个数。 - 访问和操作 vectorvectorvector 中的每个元素
注意:只能对已存在的元素进行赋值或者修改操作。如果要加入新元素,必须用 push_back 。 push_back 的作用有两个:①告诉编译器为新元素开辟空间;②将新元素存入新空间里。for(int i = 0; i < v1.size(); i++){ cout << v1[i] << endl; v1[i] = 100; cout << v1[i] << endl; }
当然我们也可以使用迭代器来访问元素。//正向迭代器 vector<string> v = { "hi","my","name","is","lee" }; for(vector<string>::iterator iter = v.begin(); iter != v.end(); iter++) { cout << *iter << endl; //下面两种方法都行 cout << (*iter).empty() << endl; cout << iter->empty() << endl; } //反向迭代器 for (vector<string>::reverse_iterator iter = v.rbegin(); iter != v.rend(); iter++) { cout << *iter << endl; }
- 其他操作
- 添加元素 v.push_back
- 如果 vectorvectorvector 元素类型是 intintint 类型,默认初始化为 000 ;如果是 stringstringstring 类型,默认初始化是空字符串。
- 一个较全的实现代码
void showvector(vector<T> v) { for(vector<T>::iterator it = v.begin(); it != v.end(); it++) { cout << *it; } cout << endl; } void work() { vector<string> v6 = { "hi","my","name","is","lee" }; v6.resize(3); //重新调整vector容量大小 showvector(v6); vector<int> v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括号 cout << v5.front() << endl; //访问第一个元素 cout << v5.back() << endl; //访问最后一个元素 showvector(v5); v5.pop_back(); //删除最后一个元素 showvector(v5); v5.push_back(6); //加入一个元素并把它放在最后 showvector(v5); v5.insert(v5.begin()+1,9); //在第二个位置插入新元素 showvector(v5); v5.erase(v5.begin() + 3); //删除第四个元素 showvector(v5); v5.insert(v5.begin() + 1, 7,8); //连续插入7个8 showvector(v5); v5.clear(); //清除所有内容 showvector(v5); }
- inset 与 push_back 的操作有什么区别?
顾名思义 push_back 把元素插入容器末尾, insert 把元素插入任何你指定的位置。不过 push_back 速度一般比 insert 快。如果能用 push_back 尽量先用 push_back。