C++中string用法解读

C++中string用法解读

1、函数find

函数find返回查找字符串的起始位置,注意这里的位置基准是从0开始。

例如:

string s1="abstract";
cout<<s1.find("ab");//这里返回的是0,记住不是1

如果没找到这个字符串,则返回值为npos

例如:

string s="abstract";
cout<<s1.find("f");//f不在字符串s中,返回的值是s.npos对应的值
//在判断在字符串s中是否存在某个元素时,可以如下调用
if(s.find("a")!=s.npos){
    //内容体
}

2、函数erase

s.erase(i,j),里面参数i,j分别表示删除s中第i个元素后j个元素

例如:

string s="abstract";
s.erase(0,1);//删除第零个元素
s.erase(0,2);//删除第零个和第一个元素

3、函数sort

使用之前调用库algorithm

1、调用对string中的元素进行排序
#include<algorithm>
string s="angoang";
sort(s.begin(),s.end());//将字符串s整个进行排序
sort(s.begin()+i,s.end()+j);//将第i到第j个元素进行排序
2、调用对数组中的元素进行排序
#include<algorithm>
int array[]={'a','c','s','q','i'};
sort(array+i,array+j);//将数组中从i到j的元素进行排序
//注意当i不取任何值时,默认为1,也就是说如果数组元素个数为10个,那么将整个数组进行排序写法如下
sort(array,array+10);//

3、调用对结构体

这里直接贴段代码,自己琢磨去吧

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef struct student{
  char name[20];
 int math;
  int english;
 }Student;
 bool cmp(Student a,Student b);
 main(){
   //先按math从小到大排序,math相等,按english从大到小排序 
   Student a[4]={{"apple",67,89},{"limei",90,56},{"apple",90,99}};
   sort(a,a+3,cmp);
   for(int i=0;i<3;i++)    
   cout<<a[i].name <<" "<<a[i].math <<" "<<a[i].english <<endl;     
 }
 bool cmp(Student a,Student b){
   if(a.math >b.math )
   	return a.math <b.math ;//按math从小到大排序 
   else if(a.math ==b.math )
    return a.english>b.english ; //math相等,按endlish从大到小排序23 
 }

4、牛客例题

题目描述:多多君最近在研究字符串之间的变换,可以对字符串进行若干次变换操作:

  1. 交换任意两个相邻的字符,代价为0。
  2. 将任意一个字符a修改成字符b,代价为 |a - b|(绝对值)。

现在有两个长度相同的字符串X和Y,多多君想知道,如果要将X和Y变成两个一样的字符串,需要的最少的代价之和是多少。

解题思路:首先根据条件1,我们知道两个字符串中相同的字符可以直接将距离设为零,并且不参与到后续计算中,等价于将这两个数分别从字符串中抹除掉。故首先第一步缩小字符串大小,其方法就是将两个字符串中相同的字符各自删除掉。通过循环遍历可以很快实现。
其次,剩下的字符串中都是不相同的字符。这时要进行统计了,计算距离最小,那么就需要进行做差并求和。但是做差要得到最小的值。我们这里提供两种思路,其一将两个串各字符相加后再做减法,其二将两个字符串对应位置的字符做减法取绝对值然后相加。对于这两种方式我们举个例子。
a[]={1,6} b[]={7,2}.这两个数组,用第一种求和后相减我们得到结果为7-9=2.我们用第二种方法得到的结果为abs(1-7)+abs(6-2)=10。显然和结果不对应。那是不是就说明第一种方法就是对的呢?这里我们将数组b[]修改为b[]={5,2}。我们按照i方法一计算得到结果为7-7=0…但是正确答案应该是1+1呀,那么问题出在哪儿呢?应为我们将数组各个数求和后相减等价于求得不是绝对值的和而是差的和的绝对值。这显然是不等价的。所以正确的做法为将a,b数组进行排序,然后逐个做差累加求和。所以这里还需要进行一次排序操作。在字符串中排序最好的方式就是使用函数sort
这里贴上代码:

#include<iostream>
#include<algorithm>
#include<algorithm>
#include<string>
using namespace std;
int findMin(string s1, string s2)
{
    for (int i = 0; i < s1.length(); i++) //length返回的是字符串长度
    {
        if (s2.find(s1[i]) != s2.npos)
        {
            s2.erase(s2.find(s1[i]), 1);
            s1.erase(i, 1);
        }
    }
    //cout << s1 << endl << s2<<endl;
    int results = 0;
    sort(s1.begin(),s1.end());
    sort(s2.begin(), s2.end());
    for (int i = 0; i < s1.length(); i++) {
        results = results + abs(s1[i] - s2[i]);
    }
    return results;
}
int main()
{
    int N;
    cin >> N;
    string s1, s2;
    cin >> s1;
    cin >> s2;
    cout << findMin(s1, s2);
    return 0;
}

喜欢的话点个赞吧!

posted @ 2021-05-28 00:05  时光荒凉了来时路  阅读(442)  评论(0)    收藏  举报