【问题标题】:sorting a string vector based on the string size [duplicate]根据字符串大小对字符串向量进行排序[重复]
【发布时间】:2013-09-16 15:13:28
【问题描述】:

我想知道如何对字符串向量进行排序,以使字符数最少的字符串位于向量顶部。例如,如果向量中有 ABCD、ABCDE、ABC。 ABC 达到顶峰。我很想知道如何使用 sort_if 实现这一点以及谓词是什么样的?也欢迎任何其他方法

【问题讨论】:

  • 没有std::sort_if()。不过,std::sort() 采用谓词的情况过多。很明显,谓词将比较参数的长度,如果它们相等,则比较字符串的字典顺序;否则,如果第一个参数较短,它将返回 true。
  • 仅供参考 - 这些答案现在已经过时了,现在不需要重载运算符,只需使用 lambda!
  • 使用 lambda 表达式排序的示例:std::sort(words.begin(), words.end(), [](std::string a, std::string b) {return a.length() < b.length(); });

标签: c++ vector stl


【解决方案1】:

制作您自己的自定义仿函数来比较字符串的大小并使用它对字符串进行排序。

struct compare {
    inline bool operator()(const std::string& first,
            const std::string& second) const
    {
        return first.size() < second.size();
    }
};

std::vector<std::string> v;
compare c;
std::sort(v.begin(), v.end(), c);

在现代 c++ 中,我们可以使用 lambda 来做同样的事情

std::vector<std::string> v;
std::sort(v.begin(), v.end(), []
    (const std::string& first, const std::string& second){
        return first.size() < second.size();
    });

【讨论】:

  • 如果字符串长度相同,您可能希望按字典顺序对字符串进行排序。函数调用运算符应该是const。
  • 你不需要做一个仿函数来做这个。一个简单的比较函数也可以做到这一点。
  • @DietmarKühl 我认为如果它们的长度相同,您只想保持稳定。猜猜这取决于提问者。
  • @ZacHowland:虽然在语义上这是对的,但实际上函数对象可以内联,而使用函数指针作为谓词通常不能内联。
  • 这不再是真的(实际上已经有一段时间没有了):stackoverflow.com/questions/4860762/…
【解决方案2】:

应该可以使用普通的std::sort(first, last, compare),以及这样的比较函数:

bool compareLen(const std::string& a, const std::string& b)
{
    return (a.size() < b.size()); 
}

【讨论】:

  • 这个 compareLen 不适合我。我已经使用了你的函数,并通过 sort(words.begin(), words.end(), compareLen);
【解决方案3】:

std::sort 采用可选参数进行自定义比较

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

您可以定义一个基于长度进行比较的函数。

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 2019-03-31
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2021-03-15
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多