Vector算法中的字符串排序不起作用

Posted

技术标签:

【中文标题】Vector算法中的字符串排序不起作用【英文标题】:Sorting strings in Vector algorithm not working 【发布时间】:2013-02-10 02:02:19 【问题描述】:

我有一个结构项向量,其中包含一个字符串。我正在尝试通过在项目中按字母顺序排列字符串来对项目向量进行排序......到目前为止我有:

vector<Item> sorter;

std::sort(sorter.begin(), sorter.end(), SortHelp);

//predcate function
bool SortHelp(Item const& one, Item const& two) 

    return one.type < two.type;

*type 是我用来排序的字符串

如何更改谓词函数以按字母顺序对字符串进行排序?

【问题讨论】:

是什么暂时不起作用? 你所做的应该已经按字母顺序排序了。 请显示Item的定义。例如。如果Item::typeconst char *,则这种比较将不起作用。 另外,为了确保得到答案,最好发布一个最小的工作示例来重现您的错误。 【参考方案1】:

以下函数将在没有外部库的情况下对两个 std::strings 进行不区分大小写的比较(尽管它是 C++11)。

bool caseinsensitivecompare(string s1, string s2) 
    locale loc;
    std::transform(s1.begin(),s1.end(),s1.begin(), 
                   [loc](char c)return std::toupper<char>(c,loc););
    std::transform(s2.begin(),s2.end(),s2.begin(), 
                   [loc](char c)return std::toupper<char>(c,loc););
    return (s1 < s2);

【讨论】:

【参考方案2】:

正如Case insensitive string comparison C++ (2012) 中所建议的,如果比较const char * 字符串,strcasecmp() 将提供正确的答案。

如果比较 C++ 字符串,Boost 库具有 is_iless(),其标头为 here,正如 Case insensitive string comparison in C++ (2008) 所建议的那样。

【讨论】:

是的,它已从字符串更改为 char[16],示例输出为:成分、武器、盔甲、武器...我如何比较 char 数组,然后看看哪个应该在哪里? @AC101 你有什么不清楚的地方?使用strcasecmp(),就像西蒙说的(通过谷歌或通过man 3 strcasecmp在linux上的文档)。

以上是关于Vector算法中的字符串排序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 push_back 将对象添加到 vector 工作正常,但使用访问器语法 [ ] 添加对象,不起作用

C++ vector<Struct> 排序不起作用

使用逗号分隔符的表格排序不起作用

C ++排序向量字符串不起作用

快速排序算法不起作用

冒泡排序不起作用