标准桶或计数排序

时间:2011-08-18 22:44:02

标签: c++ stl

我一直想知道为什么C ++标准模板库似乎没有标准的存储桶/库(分发)排序。这些在现代编程中似乎未被充分利用,显然是由于需要一种将对象转换为整数以进行排序的方法。对我来说两者看起来都比较简单,为什么我们不在库中这么做?

template<class RandomAccessIterator, class Index, class index_type=unsigned int>
void std::distribution_sort(
        RandomAccessIterator begin,
        RandomAccessIterator end
        index_type minval,
        index_type maxval,
        Index indexer,);

unsigned int indexer(const std::string& word) 
{
    switch(word.size()) {
    case 0: return 0;
    case 1: return (word[0]<<24);
    case 2: return (word[0]<<24) | (word[1]<<16);
    case 3: return (word[0]<<24) | (word[1]<<16) | (word[2]<<24);
    default: return (word[0]<<24) | (word[1]<<16) | (word[2]<<8) | (word[3]);
    }
}

int main() {
    std::vector<std::string> data;
    data.push_back("");
    data.push_back("APPLES");
    data.push_back("banana");
    std::distribution_sort(data.begin(), data.end(), 0, ~0, indexer);
} 

2 个答案:

答案 0 :(得分:2)

  
    

对我来说,两者看起来都比较简单,为什么我们不在库中这么做?

  

很多事情都很简单。这不是将它们放入图书馆的好理由。

我认为原因是std::sort对大多数情况都足够好。

答案 1 :(得分:1)

出于同样的原因,没有ASCII到EBCDIC的转换,数据库连接,自然语言分析,文本到语音合成以及一系列其他功能。

每个决策都有机会成本(意味着放弃所有事情,做其他事情),标准是程序员和实施者之间的契约。

我希望能够编写该程序:

int main (void) {
    std::accountingApplication();
    return 0;
}

而不是必须实际编写会计应用程序的代码,但我担心实施者可能无法提供这种级别的权力。

此外,对于大多数情况,C和C ++ 都具有非常好的排序功能。如果事实证明这不符合某人的特定数据,那么他们就应该自己编写。

如果标准添加了桶分类,为什么要停在那里?为什么不为各种数据分布单独排序(即使是备受诟病的冒泡排序也适用于已经大部分排序的小型集合或集合)?

因为这种推理会在2166而不是2025年左右给我们下一个C ++标准,这就是原因: - )

另请参阅this related answer以获取有关这些要点的更详细说明。


顺便说一下,我不确定将对象转换为可分发整数的要求是一个问题 - 这可以通过回调(如qsort中的比较函数)或标准方法轻松解决(像Java的toString)。