为什么我的函数接受一个`std::string`来排序,却不改变它?

问题描述 投票:1回答:1

我有一个项目,我想问一些事情。我怎样才能用下面的函数来制作一个降序的字符串?cin<<word;? 我从一个网站上找到的,试了一下,但是不能用cin。下面是代码。

void descOrder(string s) 
{ 
    sort(s.begin(), s.end(), greater<char>()); 
} 

int main() 
{ 
    string s = "geeksforgeeks"; 
    descOrder(s); // function call 
    return 0; 
} 

为了更清楚,我想这样做

  • 输入。geek for geeks
  • 输出 ssrokkggfeeee

另外,如何用字母表替换字符串中的字母,比如Hello我想这样H是I,e是f,l是m,o是p,如果一个单词中含有字母z,我想用字母a替换。

最后一个问题,我想从一个字符串中先打印出根据,再打印出元音。

c++ string sorting pass-by-reference
1个回答
2
投票

你正在传递你的 std::string 按价值 desOrder() 从中获取一份副本,然后进行分类,你什么也得不到。

把你的 std::string 参考,才能改得了,而不是照搬。

#include <string>
#include <iostream>
#include <algorithm>

void descOrder(std::string & s)
{
    std::sort(s.begin(), s.end(), std::greater<char>());
}

int main()
{
    std::string s = "geeksforgeeks";
    descOrder(s); // function call
    std::cout << s;
    return 0;
}

Plz,每个帖子发一个问题,看看这个。为什么 "使用命名空间std; "被认为是不好的做法?


1
投票

有两种方法适用。

1. 通过引用传值。

当你通过引用传递一个变量时,确实会对原变量的值进行操作。

#include <iostream>
#include <algorithm>

void descOrder(std::string & s) // just use an '&' sign here
{ 
    sort(s.begin(), s.end(), std::greater<char>()); 
} 

int main() 
{ 
    std::string s = "geeksforgeeks";

    descOrder(s); // function call

    std::cout << s << std::endl;

    return 0; 
}

2. 返回值而不是通过引用传递。

如果你不想改变原来的值,而想存储在其他变量中或直接打印出来,你可以这样做:

#include <iostream>
#include <algorithm>

std::string descOrder(std::string s) 
{ 
    sort(s.begin(), s.end(), std::greater<char>());
    return s;
} 

int main() 
{ 
    std::string s = "geeksforgeeks";

    std::string changedS = descOrder(s); // function call AND assigning to another variable

    std::cout << changedS << std::endl;

    // alternatively (uncomment)...
    // std::cout << descOrder(s) << std::endl; // if you just want to print

    return 0; 
}
© www.soinside.com 2019 - 2024. All rights reserved.