在 cpp 中使用带有 std::vector 的字符串长度对字符串数组进行排序

sort a string array using string length with std::vector in cpp

我在 cpp 中有一个函数,我想使用它根据每个字符串的单独长度对字符串数组进行排序,我试图将特定索引处的元素长度与该元素的长度进行比较驻留在下一个索引中。如果下一个索引的长度小于第一个索引中字符串的长度,那么我将长度较短的字符串推到长度较大的字符串的索引中。我尝试的代码如下所示,我在主程序中使用它时遇到问题,编译器生成了一个错误,指出 :[Error] could not convert '{"Mario", "Bowser", "Link"}' from '<brace-enclosed initializer list>' to 'std::vector<std::basic_string<char> >'.

#include <iostream>
#include <ctype.h>
#include <vector>

//below is my sort according to length function
using namespace std;
std::vector<std::string> sortByLength(std::vector<std::string> arr) {

    for(int k=0;k<arr.size();k++){
        if(arr[k+1].size()<arr[k].size()){
            //push the shorter string to the lower index
            arr[k]=arr[k+1];
        }
    }
    return arr;
}
//below is the main function
int main(){
//this line below generates compile error
std::vector<string> myarr=sortByLength({"Mario", "Bowser", "Link"})<<endl;
cout<<myarr<<endl;

return 0;
}

给你。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
void printVec(std::vector<std::string>& vec) {
    for(auto&& v:vec) {
        std::cout<<v<<std::endl;
    }
}
int main() {
    std::vector<std::string> vec {"abc","ab","a","abcd"};
    printVec(vec);
    std::sort(vec.begin(), vec.end(), [](std::string& a, std::string& b) {
        return a.length() > b.length();
    });
    printVec(vec);
    return 0;
}

注意:适用于 c++11 或更高版本。

作为排序的替代方法,您可以将字符串移动到已排序的容器中:

#include <iostream>
#include <set>
#include <string>
#include <vector>

struct StringLengthComparer
{
    bool operator ()(std::string left, std::string right) const 
    {
        return left.length() < right.length();
    }
};

using StringMultiset = std::multiset<std::string, StringLengthComparer>;

using std::cout;

StringMultiset sortByLength(std::vector<std::string> arr) 
{
    return StringMultiset{arr.begin(), arr.end()};
}

int main()
{
    auto myset = sortByLength({"Mario", "Bowser", "Link"});

    for(auto item : myset)
    {
        cout << item<< '\n';
    }

    return 0;
}