2

基本的に、私のタスクは、大文字と小文字を区別せずに可変長の文字列の束をソートする必要があります。cstringsを比較する関数strcasecmp()があることは理解していますが、文字列では機能しません。現在、文字列にgetline()を使用しているので、一度に1行ずつ文字列を読み取ることができます。これらを文字列のベクトルに追加し、strcasecmp()を呼び出すたびにcstringsに変換します。strcasecmp()と比較する前に各文字列をcstringに変換する代わりに、事前定義されたchar配列サイズがなくてもcstringにcin.getline()を使用できる方法があるかどうか疑問に思いました。または、文字列を読み込んでcstringに変換し、ベクトルに格納してから並べ替えるのが最善の解決策でしょうか。

4

2 に答える 2

2

「cstringに変換する」とはc_str()、stringのメンバーを使用することを意味すると思います。その場合、実際には変換ではないほとんどの実装では、それは単なるアクセサーです。この違いは、パフォーマンスが心配な場合にのみ重要です(自分のように聞こえます)。内部的には、std :: stringは(ほとんどの場合、ただし技術的にはそうである必要はありません)「cstring」として表されます。クラスはサイズの管理を担当しますが、その下に動的に割り当てられたcstringです。

したがって、直接答えるには、cin.getlineを使用するときに配列のサイズを指定する必要があります。サイズを指定したくない場合は、getlineとstd::stringを使用します。そのアプローチには何の問題もありません。

于 2010-04-02T23:15:13.803 に答える
0

C++はそれ自体でかなり効率的です。あなたが本当に他のことをする必要があることが証明されていない限り、それをやらせてください。

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
#include <cstring>

using namespace std;

bool cmp(string a, string b)
{
    return(strcasecmp(a.c_str(), b.c_str()) < 0);
}  


int main(int argc, char *argv[])
{
    vector<string> strArr;

    //too lazy to test with getline(cin, str);

    strArr.push_back("aaaaa");
    strArr.push_back("AAAAA");
    strArr.push_back("ababab");
    strArr.push_back("bababa");
    strArr.push_back("abcabc");
    strArr.push_back("cbacba");
    strArr.push_back("AbCdEf");
    strArr.push_back("aBcDeF");
    strArr.push_back("  whatever");

    sort(strArr.begin(), strArr.end(), cmp);

    copy(strArr.begin(), strArr.end(), ostream_iterator<string>(cout, " \n"));

    return(0);
}
于 2010-04-03T02:52:16.280 に答える