2

基本上我的任务是必须对一堆可变长度的字符串进行排序,忽略大小写。我知道有一个函数 strcasecmp() 可以比较 cstrings,但不适用于字符串。现在我将 getline() 用于字符串,所以我可以一次读取一行字符串。我将这些添加到字符串向量中,然后为每次调用 strcasecmp() 转换为 cstrings。不必在与 strcasecmp() 比较之前将每个字符串转换为 cstring,我想知道是否有一种方法可以在没有预定义 char 数组大小的情况下将 cin.getline() 用于 cstrings。或者,最好的解决方案是只读取字符串,转换为 cstring,存储在向量中,然后排序?

4

2 回答 2

2

我假设“转换为 cstring”是指使用c_str()字符串的成员。如果是这种情况,在大多数不是真正转换的实现中,它只是一个访问器。仅当您担心性能(听起来像您)时,差异才重要。在内部 std::strings (几乎总是,但技术上不必)表示为“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 回答