【问题标题】:How to sort a vector <char*>?如何对向量 <char*> 进行排序?
【发布时间】:2011-12-12 23:30:29
【问题描述】:
#include <algorithm>

bool comparisonFunc(char* c1, char* c2)
{
     return strcmp(c1, c2) ? 0 : 1;
}

vector<char*> myVec;
vector<char*>::iterator itr;
sort(myVec.begin(), myVec.end(), comparisonFunc)

这是正确的还是有更好的方法?

【问题讨论】:

  • itr 似乎未使用。而strcmp(...) ? 0 : 1 会更习惯地写成!strcmp(...)。但我不知道你的实际问题的答案。
  • @user1002288 你为什么不用std::sort(myVec.begin(), myVec.end(), ::strcmp);directlt?
  • 注意:strcmp 返回 -1、0 或 +1,具体取决于 c1 是 c2。因此,您需要 strcmp(lhs, rhs) &lt; 0 进行小于排序。

标签: c++ string sorting vector


【解决方案1】:

std::sort期望一个“小于”谓词。你应该像这样实现你的comparisonFunc()

bool comparisonFunc(const char *c1, const char *c2)
{
    return strcmp(c1, c2) < 0;
}

(注意consts;它们很重要。)

您当前的实现不可能工作,因为您只是返回值是否相等。这些信息不足以进行排序 - 您需要知道哪个更小,哪个更大(当然,除非值相等)。

【讨论】:

  • 为什么 const 在这里很重要?
  • std::sort 永远不会让你修改容器的内容,因为它只想知道哪个更小。
  • bool comparisonFunc(const char* c1, const char* c2) const {} 怎么样?
  • 为什么不直接std::sort(myVec.begin(), myVec.end(), ::strcmp);
  • strcmp() 小于。它不能直接用作排序谓词。
【解决方案2】:

使用现代 C++,您可以内联定义比较方法:

std::vector<const char*> strings;
/* fill strings vector */
std::sort(strings.begin(), strings.end(), [](const char* lhs, const char* rhs) {
    return strcmp(lhs, rhs) < 0;
});

请注意,strcmp 返回 -1/0/+1 表示序数,因此是 &lt; 0 比较。

【讨论】:

    【解决方案3】:

    我更经常想对指向记录的指针向量进行排序,而不仅仅是简单的 C 字符串...

        template<>
        struct std::less<const foo*>
        {
           bool operator()(const foo* lhs, const foo* rhs) const
           {
              return strcmp(lhs->key, rhs->key);
           }
        };
    

    这重新定义了 foo* 的比较,以便默认比较在排序中起作用。对我来说,这种风格感觉更具声明性,而另一种则更具程序性。如果您需要多个排序,则使用默认值是有问题的;如果您想确保 foo*s 的所有有序集合的顺序相同,那很好。

    std::vector<foo*> db;
    std::sort(db.begin(), db.end());
    

    【讨论】:

    • 你不是说return strcmp(...) &lt; 0;吗?
    • IMO,这是相当有问题的。您使 foo_p1 &lt; foo_p2std::less&lt;const foo*&gt;()(foo_p1, foo_p2) 的行为不同,此外,后者的结果与 std::less&lt;foo*&gt;()(foo_p1, foo_p2) 不同。
    • ... 标准甚至似乎没有建议排序算法应该默认使用 std::less 。您的 sn-p 充满了错误,最终根本不需要工作。
    • 呃,我对 strcmp() 不好,抱歉。标准在哪里找到了 T
    • 为诸如 T* 之类的非类项目定义 operator可能。
    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多