2016-11-06 27 views
0

ファイルのテキストを辞書順に並べ替えたいが、辞書順が本当に何をするのか理解できない。文字列の辞書順比較[大文字と小文字を区別しない]

文字列を注文すると別の問題が発生します。関係演算子はASCII値を使用するので、真でなければならないときは、

betty < Dianeはfalseです。私は辞書式順序でそれを設定する方法を ベティ、ダイアン、123、アナ、ミーガン、チャールズ、2、12

は、サンプルリストを考えてみましょうか?

+0

['std :: string'](http://en.cppreference.com/w/cpp/string/basic_string)は既に辞書編集比較を使用しています。 –

+0

それはどういう意味ですか? @ someprogrammerdude – FastKid12

+0

STLを使用して作業を簡単にする代わりに、学習する場合は、独自の基数ソートを実装してみてください。 –

答えて

1

これはあなたが望むことをしませんか?

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <cctype> 

int main() { 
    std::vector<std::string> v {"Diane", "123", "Ana", "Megan", "charles", "two", "12"}; 

    for (const auto& s : v) { 
    std::cout << s << ' '; 
    }; 
    std::cout << '\n'; 

    std::sort(v.begin(), v.end(), [](const std::string& a, const std::string& b) { 
    for (int i = 0 ; i < std::min(a.size(), b.size()) ; i++) { 
     const auto a_char = std::tolower(a[i]); 
     const auto b_char = std::tolower(b[i]); 
     if (a_char != b_char) { 
     return a_char < b_char; 
     } 
    } 
    return a.size() < b.size(); 
    }); 

    for (const auto& s : v) { 
    std::cout << s << ' '; 
    }; 
    std::cout << '\n'; 

    return 0; 
} 

標準出力は次のようになります。

Diane 123 Ana Megan charles two 12 
12 123 Ana charles Diane Megan two 
+0

Hmmは私のためにうまくいきません – FastKid12

+0

これは間違っています。大文字小文字を区別しない検索ではありません。完全な質問を読む。 –

2

アプローチ:

  1. リスト内のすべての単語を入れてmap <convert_to_lower_case(words) as string, index as integer>を使用してください。その後
  2. 使用してソートされたベクトルmyVecを作成します。

    for(it_type iterator = m.begin(); iterator != m.end(); iterator++) { myVec.push_back(original_list[it->second]); }

myVecは、あなたが探している辞書順ソートされたリストです。 あなたはconvert_to_lower_case(word)を実装する必要があります。

for(int i = 0; str[i]; i++){ 
    word[i] = tolower(str[i]); 
} 

その他の答えはあまりにも良いですが、ベクトルをソートするためのコンパレータを使用しています。