字符串中的技巧

不定期更新

注 :字符串中的 \(stl\) 放在这里


题面 , 题目大意就是给一堆数字,将其排列,使组成的数字最小.

\(①\) \(:\) 将其直接sort , 再按顺序排列会有问题,比如样例中的 \(32\) \(321\) ,\(32132\) 的字典序就小于 \(32321\) 的字典序, 这时利用 cmp : a+b < b+a 即可.

bool cmp(string a,string b) {return a+b<b+a;}

\(②\) \(:\) 去前导零利用好 erase 函数.

while(ans.length()&&ans[0]=='0')
		ans.erase(ans.begin());
	if(ans.length()==0) cout<<"0";
	cout<<ans;
	

关于 erase 函数

\(①\) \(:\) 字符数组是不能使用这个函数的.

\(②\) \(:\) erase(pos,n) 删除从 \(pos\) 位置开始包括 \(pos\) 在内的连续的 \(n\) 个字符.

\(③\) \(:\) erase(pos) 删除pos处字符,要注意这里与 \(①\) 不同的是,这里的 \(pos\) 是迭代器. 例如删除 \(1\) 位置的字符 ,我们只能写 erase(a.begin()+1) ,而不能写 erase(1).

\(④\) \(:\) erase(first,end) 删除区间 \([first,end]\) 的字符 ,同样注意迭代器的问题. 例如 erase(a.begin()+1,a.end()-1) .

迭代器 \(:\) 容器中确定地址 (浅显理解)


\(③\) \(: updata\) 字符串函数
\(strcat\)

strcat(a,b) , 将 \(b\) 字符串复制到 \(a\) 的结尾.

对比 \(strncat\)

strncat(a,b,n) , 将 \(b\) 字符串的 \(n\) 位复制到 \(a\) 的结尾.


\(strcmp\)

strcmp(a,b)\(a\) 字典序大于 \(b\) 则返回正数 , 小于则返回负数 , 相等则返回 \(0\) .

对比 \(strncmp\) , \(stricmp\)

strncmp(a,b,n)\(a\) , \(b\) 的前 \(n\) 位进行比较.

stricmp(a,b) 忽略 \(a\) , \(b\) 的大小写进行比较.


\(strlwr\) , \(strupr\)

strlwr(a) : 将字符串 \(a\) 中的大写转换为小写.

strupr(a) :将字符串 \(a\) 中的小写转换为大写.


\(④ :\) 字符串输入 , 输出

\(①: getline\) 函数

先讲一下 \(cin.getline(name , size)\) , 注意这个函数是对于字符数组的 , 非字符串 .

其中 \(name\) 是字符数组的名称 , \(size\) 是你需要的字符长度减一 , 例如输入 \(abc\) , \(size\) 就得是 \(4\) .

注意 \(size\) 最多到字符长度 \(+1\) , 且可以读入空格 空格是算一个长度的. (不保留换行符 , 用空字符替换行符)

再者讲 \(getline(cin,s)\) , \(s\) 是字符串 , 而不是字符数组 , 也是读一行读到换行符 , 空格可以读入.

\(② : get\) 函数

\(cin.get(char ch)\) 读取输入下个字符(是可以读入空格的)

\(cin.get(name,size)\) , 参数意义跟 \(cin.getline()\) 一致 , 但它会保留换行符 , 连用两个 \(cin.get\) (第一个数可以读完时) , 第二个 \(cin.get\) 因读到第一个 \(cin.get\) 留下的换行符则直接停止.


单个字符串排序

string a;

sort(a.begin(),a.end());

sort(a.begin(),a.end(),greater<char>());


\(tolower\) , \(toupper\) 函数
两个函数都争对于单个字符 , \(tolower\) 是将大写转小写 , 本身是小写的话就不变 , \(toupper\) 同理.
注意二者返回的都是 \(ascll\) 码 , 要转回字符.


posted @ 2021-10-09 11:36  xqy2003  阅读(45)  评论(0)    收藏  举报