Есть ли способ использовать cin.getline () без необходимости определять размер массива символов перед рукой? - PullRequest
2 голосов
/ 03 апреля 2010

В основном моя задача состоит в том, чтобы отсортировать кучу строк переменной длины без учета регистра.Я понимаю, что есть функция strcasecmp (), которая сравнивает cstrings, но не работает со строками.Прямо сейчас я использую getline () для строк, поэтому я могу просто читать строки по одной строке за раз.Я добавляю их в вектор строк, а затем конвертирую в cstrings для каждого вызова strcasecmp ().Вместо того, чтобы преобразовывать каждую строку в cstring перед сравнением с strcasecmp (), мне было интересно, есть ли способ использовать cin.getline () для cstrings без предопределенного размера массива char.Или лучшим решением было бы просто прочитать в строку, преобразовать в cstring, сохранить в векторе, а затем отсортировать?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2010

Я предполагаю, что под "преобразованием в cstring" вы подразумеваете использование c_str() члена строки. Если это так, то в большинстве реализаций это не преобразование, а просто средство доступа. Разница важна только в том случае, если вы беспокоитесь о производительности (что звучит так, как вы). Внутренне std :: strings (почти всегда, но технически не обязательно) представлены как "cstring". Класс позаботится о том, чтобы управлять его размером, но это просто динамически размещаемая строка внизу.

Итак, для прямого ответа: вы должны указать размер массива при использовании cin.getline. Если вы не хотите указывать размер, используйте getline и std :: string. С этим подходом все в порядке.

0 голосов
/ 03 апреля 2010

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);
}
...