2017-04-25 51 views
-2

應該出現我有以下字符串集串contarting「<cr>」最後在排序

'aa' 
'hello' 
'start' 
'<1-10>' 
'<cr>' 

當我的qsort使用從C中的排序庫,我得到下面的輸出

<1-10> 
<cr> 
aa 
hello 
start 

但我想要以下輸出

<1-10> 
aa 
hello 
start 
<cr> 

感謝您的幫助。

+1

請出示你的代碼。我們不介意讀者,也不會在沒有看到它的情況下告訴你它有什麼問題。請僅使用相關的語言標籤 - C和C++是不同的語言。 – kaylum

+0

C或C++?你想要使用哪個數據結構作爲字符串list/array/raw pointer array/vector/...? –

+0

C,我正在使用vector – deathstroke05

回答

3
  1. 將包含<cr>的字符串移動到不同的容器中。
  2. 對其餘的字符串進行排序。
  3. 排序保有含<cr>
  4. 琴絃的容器添加第二個容器項目在第一個列表的末尾

而且,而是採用單獨的容器,你可以在年底移動包含<cr>字符串列表(std::partition),並在兩個子陣列上應用qsort

bool partitioner(string str) { 
    return str.find("<cr>") == string::npos; 
} 

現在:

vector<string> v {"hello", "world", "<cr>", "<cr>string"}; 
auto bound = partition(v.begin(), v.end(), partitioner); 
sort(v.begin(), bound); 
sort(bound, v.end()); 
0

我不知道您的實際設置,因爲vector是一個C++類,而你的國家,你要使用C. 不管怎樣,也許以下爲std :: vector編寫的代碼與std :: sort結合使用,顯示了基本原理,您可以在其中引入用於排序的自定義比較函數。請注意,qsort也允許自定義比較函數,但語法會有所不同。

自定義比較函數的工作原理如下:如果兩個字符串都以<開頭,則比較它們的餘數。如果其中一個以<開頭,那麼這個總是排在另一個之下。否則,他們只是比較。我用char* - 數據類型跟上的C一番風味爲你:-):

int main() { 

    std::vector<const char*> s = { 
     "aa", 
     "start", 
     "hello", 
     "<d-10>", 
     "<cr>" 
    }; 

    // sort using a custom function object 
    struct { 
     bool operator()(const char*a, const char*b) 
     { 
      if (*a == '<') { 
       if (*b == '<') { 
        return strcmp(a+1,b+1) < 0; 
       } 
       else { 
        return false; 
       } 
      } 
      else if (*b == '<') { 
       if (*a == '<') { 
        return strcmp(a+1,b+1) < 0; 
       } 
       else { 
        return true; 
       } 
      } 
      else 
       return strcmp(a,b) < 0; 
     } 
    } customLess; 

    std::sort(s.begin(), s.end(), customLess); 
    for (auto a : s) { 
     std::cout << a << std::endl; 
    } 

    return 0; 
} 

輸出:

aa 
hello 
start 
<cr> 
<d-10>