【问题标题】:Sorting 2D array of chars C++对二维字符数组进行排序 C++
【发布时间】:2011-02-17 12:17:30
【问题描述】:

我有一个 2d 字符数组,在每一行中我存储一个名称...例如:

J O H N
P E T E R
S T E P H E N
A R N O L D
J A C K

我应该如何对数组进行排序以便最终得到

A R N O L D
J A C K
J O H N
P E T E R
S T E P H E N

这是一个二维字符数组.....没有字符串或字符点......

【问题讨论】:

  • 字符串数组和字符数组的最大区别是什么?排序算法也应该适用于此。就是这样,而不是交换两个字符串的位置,而是对数组进行洗牌。或指针。
  • 好吧,总得有人说吧。不要以这种方式存储字符串。它会让你的生活更轻松。

标签: c++ sorting multidimensional-array bubble-sort


【解决方案1】:

不要冒泡排序 - 点数 1。

第二点:

比较每个子数组的第一个字符(即数组[x][0]),如果需要移动,然后使用while循环移动子数组x中的所有个字符...或者通过保存子数组并像这样移动它......

【讨论】:

    【解决方案2】:
    #define MAX_NAME 8
    
    char names[][MAX_NAME] = {"JOHN", "PETER", "STEPHEN", "ARNOLD", "JACK"};
     // strcmp is really (int (*)(const char *, const char *)), so we cast.
    qsort(names, sizeof(names) / MAX_NAME, MAX_NAME, 
      (int (*)(const void *, const void *)) strcmp);
    

    请注意,这可能不是冒泡排序。

    【讨论】:

    • 错误:从 'int ()(const char, const char*)throw ()' 到 'int ()(const void) 的无效转换>, const void*)'|
    • 我添加了一个演员表,应该可以解决该错误。基本上,strcmp 接受const char*,而 qsort 需要一个接受const void* 的函数。
    • 我现在没有错误,但是当我打印数组时它正在做一些事情,没有任何东西被打印出来。但在调用此方法之前,一切都会被打印出来
    • 我做了一个简单的working demo。它显示它在之前和之后打印。
    • 是的,但这是一个 char 指针数组.....我有一个 char 的二维数组,所以这真的不起作用。
    【解决方案3】:

    C++ 不支持复制或比较 C 样式的数组,但它支持对非常薄的 C 样式数组进行此类操作。试试boost::array,和C++0x中的tr1::arraystd::array一样。

    或者,自己动手:

    #include <algorithm>
    
    template< class T, size_t s >
    struct array {
        T arr[s]; // public data, no destructor, inheritance, virtuals, etc
                  // => type is aggregate
        operator T const *() const { return arr; }
        operator T *() { return arr; } // as close as we can get to array emulation
    
        friend bool operator< ( array const &l, array const &r )
            { return std::lexicographical_compare( l, l+s, r, r+s ); }
    };
    
    array< char, 10 > names[] // aggregate initialization — this is standard C++
        = { "JOHN", "PETER", "ARNOLD", "JACK" };
    
    #include <iostream>
    using namespace std;
    
    int main() {
    sort( names, names + sizeof names / sizeof *names );
    
    for ( array<char,10> *s = names; s != names + sizeof names/sizeof*names; ++ s )
        cerr << *s << endl;
    }
    

    如果您的编译器没有疯狂地向上述结构添加填充,您可以安全地reinterpret_cast 一个 C 样式数组和一个 array

    template< class T, size_t s >
    array< T, s > &wrap_arr( T (&a)[s] ) {
        return reinterpret_cast< array<T,s> & >( a );
    
            // make sure the compiler isn't really wacky...
            // I would call this optional:
        BOOST_STATIC_ASSERT( sizeof( T[s] ) == sizeof( array<T,s> ) );
    }
    
    char names_c[][10] // or whatever C input from wherever
        = { "JOHN", "PETER", "ARNOLD", "JACK" };
    
    array<char, 10> *names = &wrap_arr( names_c[0] );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-16
      • 2014-08-10
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      相关资源
      最近更新 更多