代码之家  ›  专栏  ›  技术社区  ›  baash05

有没有一种简单的方法可以对char*数组进行排序?C++

  •  4
  • baash05  · 技术社区  · 17 年前

    char* 我工作的公司将数据存储在平面文件中。。有时会对数据进行排序,但有时不会。 我想对文件中的数据进行排序。

    有没有更简单的方法?

    当然,就地排序是最好的选择。我在处理大文件,内存很少。但我会考虑所有的选择。

    以下是一些示例数据:

    the data is of fixed length
    the Data is of fixed length
    thIS data is of fixed lengt
    

    \r\n ),虽然这对这类人来说并不重要。

    9 回复  |  直到 13 年前
        1
  •  15
  •   Leon Timmermans    17 年前
    template<size_t length> int less(const char* left, const char* right) {
        return memcmp(left, right, length) < 0;
    }
    
    std::sort(array, array + array_length, less<buffer_length>);
    
        2
  •  6
  •   Aaron Digulla    17 年前

    如果无法将数据放入RAM,请使用GNU排序程序(外部):它将对任意大小的文件进行排序,文件越大,创建进程的额外成本越小。

        3
  •  5
  •   John Dibling    17 年前

    您可以在STL数组中对本机数据类型使用算法,而不仅仅是在STL容器上。但是,使用std::sort的另一个建议不会像POST那样起作用,因为strcmp返回一个值,当字符串不相同时,该值在所有比较中的计算结果都为true,而不仅仅是如果左手边小于右手边——这正是std::sort想要的;左侧返回true的二进制谓词小于右侧。

    这项工作:

    struct string_lt : public std::binary_function<bool, char, char>
    {
        bool operator()(const char* lhs, const char* rhs)
        {
            int ret = strcmp(lhs, rhs);
            return ret < 0;
        }
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        char* strings [] = {"Hello", "World", "Alpha", "Beta", "Omega"};
        size_t numStrings = sizeof(strings)/sizeof(strings[0]);
    
        std::sort(&strings[0], &strings[numStrings], string_lt());
    
        return 0;
    }
    
        4
  •  3
  •   Johannes Schaub - litb    17 年前

    boost::bind 我能做到:

    // ascending
    std::sort(c, c + size,  boost::bind(std::strcmp, _1, _2) < 0); 
    
    // descending
    std::sort(c, c + size,  boost::bind(std::strcmp, _1, _2) > 0); 
    

    编辑 :字符串不是以null结尾的:

    // ascending
    std::sort(c, c + array_size,  boost::bind(std::memcmp, _1, _2, size) < 0); 
    
    // descending
    std::sort(c, c + array_size,  boost::bind(std::memcmp, _1, _2, size) > 0); 
    
        5
  •  2
  •   Ralf    17 年前

    可能最简单的方法是使用旧的stdlib.h函数qsort。 这应该起作用:

    qsort( array, num_elements, sizeof( char* ), strcmp )
    

    请注意,这是标准C,仅适用于英文文本。

    如果你有一个字符串对象列表,那么C++中其他的东西是可能的。

    如果您在Linux上编写gtk或Qt应用程序,那么我建议您事先看看这些库。

        6
  •  2
  •   Ovidiu Pacurar    17 年前

    如果文件较大且不适合RAM,则可以使用 bin/bucket 排序将数据拆分为较小的文件,并最终在结果文件中聚合各部分。其他响应将向您展示如何对每个bucket文件进行排序。

        7
  •  0
  •   Jonathan Leffler    17 年前

    在C中排序字符串的规范方法,因此,在C++中使用一个可用但不一定推荐的方法,使用间接的级别。 strcmp() :

    static int qsort_strcmp(const void *v1, const void *v2)
    {
        const char *s1 = *(char * const *)v1;
        const char *s2 = *(char * const *)v2;
        return(strcmp(s1, s2));
    }
    
    static void somefunc(void)   // Or omit the parameter altogether in C++
    {
        char **array = ...assignment...
        size_t num_in_array = ...number of char pointers in array...
        ...
        qsort(array, num_in_array, sizeof(char *), qsort_strcmp);
        ...more code...
    }
    
        8
  •  0
  •   Tom    17 年前

    1. 到位将需要一个 内存拷贝数。如果可以,请使用shell排序。一旦知道了最后的顺序,在线性时间内对字符串进行重新排序就容易多了。
    2. 真正地 std::sort , qsort ,以及任何其他通用排序)始终需要O(N logn)时间。基数排序一次比较一个位数(从 str[0] str[K-1] 对于一个K长度的字符串),和总体只需要O(N)个时间即可执行。

    有关基数排序算法的详细说明,请参阅Internet,我无法提供这些详细说明。除了我所说的,我将避免使用标准图书馆分类设施的所有其他解决方案。不幸的是,它们不是为你的特殊问题设计的。

        9
  •  0
  •   unwesen unwesen    17 年前

    http://en.wikipedia.org/wiki/Memory-mapped_file http://en.wikipedia.org/wiki/Mmap )在POSIX操作系统上。实际上,您将获得一个指向表示文件内容的连续内存的指针。

    好的一面是,操作系统将负责将部分文件加载到内存中,并根据需要再次卸载它们。

    一个缺点是,如果可能有多个进程访问该文件,则需要解析为某种形式的文件锁定,以避免损坏。

    希望这能给你一些想法!