换行符\n 不是/n错的离谱了
cin :以空格,换行符,制表符(tab键 ‘\t’),因此字符串只能保存一个单词,空格,换行符,制表符还放在输入流中
getline:读取一行,直到遇见换行符,丢弃换行符
get:读取一行,直到遇见换行符,保留到输入序列中
while(getline(cin, str)) cout << str;
//15 _
//I love GPLT
int n;
char ch;
cin >> n >> ch;
getchar();//这种输入类型,一定要加一个getchar(),读取换行符,
//要不然getline不会读取内容,读到换行符就停止读写并且丢弃换行符
string str;
getline(cin, str);
//I love GPLT! It's a fun game!
//aeiou
string a, b;
getline(cin, a);
//getchar();不用读换行符,上一行的getline已经读到换行符且丢弃了
getline(cin, b);
sort()排序不是稳定排序 ,sort是主要用到了快速排序(平均时间复杂度为O(nlogn)),还结合了插入排序(时间复杂度为O(n2))和堆排序(时间复杂度为O(nlogn))。
不加自定义函数,sort排序根据字典序从小到大排序,不看长度。
字符串sort字符串排序是不稳定的,当两个元素等价时,前后顺序不一定。
如按字符串的长度从小到大排序,长度相等则按输入的顺序进行输出,所以不能用sort
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
bool cmp(string a, string b)
{ return a.size() < b.size();}
int main()
{
string str[30];
int i = 0;
while(cin >> str[i] && str[i] != "#")
i ++;
sort(str, str + i, cmp);
for(int j = 0; j < i; j ++ )
cout << str[j] << ' ';//排序不稳定
return-0;
}
string的强大之处
比较
String 类的常见运算符包括 >、<、==、>=、<=、!=。其意义分别为"大于"、“小于”、“等于”、“大于等于”、“小于等于”、“不等于”
(1)find
find(str,position)
find()的两个参数:
str:是要找的元素
position:字符串中的某个位置,表示从从这个位置开始的字符串中找指定元素。
str.find(str2) 当str2时str的子串时,返回其在str中第一次出现的位置,如果不是子串,返回string::npos。
if(str.find(str2)!=string::npos)
(2)erase
str.erase(pos,length) pos为要删除的起始位置,length为字符个数
length不指定,则起始位置后面的内容全部删除
erase (iterator first, iterator last);
first和last分别表示范围的起点和终点。需要注意的是,该范围包含first,但是不包含last,即该范围是**[first, last)**。erase()函数的返回值是删除后的字符串。
string str("This is an example sentence.");
str.erase(10, 8);
cout << str;//This is an sentence.
str.erase(str.begin() + 5, str.end() - 9);
//This sentence.
str.erase(str.begin() + 9);
//This is a example sentence.(只删除迭代器所指向的位置的一个字符)
比如:Tomcat is a male ccatat ,要删除子串cat,其结果是Tom is a male
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string a, b;
getline(cin, a);
getline(cin, b);
int idx = a.npos;
while((idx = a.find(b)) != a.npos)
{
a.erase(idx, b.size());
}
cout << a;
return 0;
}
(3)substr
str.substr(pos, len)表示str从pos这个位置开始拷贝len个字符
返回string
string str;
str = "012345";
cout << str.substr(0, 4);//0123
(4)replace
str.replace(pos, len, str)从pos这个位置开始的len个字符,替换成str这个字符串
str.replace(pos,len, str, spos, slen)把源字符串中从pos开始的len长度的字符串替换成str中从spos开始的,长度为slen的字符串
str = "I";
str.replace(0, 1, "234");
cout << str;//234
str = "I";
str.replace(0, 1, "234", 1, 2);
cout << str;//34
(5)string转int
string str = "12345";
int nu = stoi(str);//nu = 12345;
nu = stoi(str.substr(1));//nu = 2345;
(6)int转string
string str;
n = 2345;
str = to_string(n);//str = "2345";