2010-04-02 4 views
2

기본적으로 내 작업은 가변 길이의 문자열을 대소 문자를 구분하지 않고 정렬해야합니다. strcasecmp() cstrings을 비교하지만 문자열에서 작동하지 않는 함수가 있다는 것을 알고 있습니다. 지금은 문자열에 대해 getline()을 사용하고 있으므로 한 번에 한 줄씩 문자열을 읽을 수 있습니다. 이들을 문자열 벡터에 추가 한 다음 strcasecmp()를 호출 할 때마다 cstring으로 변환합니다. strcasecmp()와 비교하기 전에 각 문자열을 cstring으로 변환하는 대신, 미리 정의 된 char 배열 크기를 갖지 않고 cstring에 cin.getline()을 사용할 수있는 방법이 있는지 궁금합니다. 아니면, 최고의 솔루션은 단지 문자열을 읽고, cstring으로 변환하고, 벡터에 저장 한 다음 정렬하는 것입니까?거기에 이전에 char 배열 크기를 정의 할 필요없이 cin.getline()을 사용하는 방법이 있습니까?

답변

2

"convert to cstring"은 문자열의 c_str() 멤버를 사용한다는 것을 의미합니다. 그렇다면 실제로 변환이 아닌 대부분의 구현에서 단순한 접근 자일뿐입니다. 차이점은 성능에 대해 걱정하는 경우에만 중요합니다 (사용자가있는 것처럼 들리는). 내부적으로 std :: strings는 "거의 항상 그렇지만 기술적으로는 필요하지 않습니다" "cstring"으로 표현됩니다. 이 클래스는 크기를 관리하지만, 동적으로 할당 된 cstring 일뿐입니다.

직접 답하려면 : cin.getline을 사용할 때 배열의 크기를 지정해야합니다. 크기를 지정하지 않으려면 getline 및 std :: string을 사용하십시오. 이 접근 방식에는 아무런 문제가 없습니다.

+0

흠 stream.c_str()의 추가 줄이 상당히 느려지지는 않습니까? – zebraman

+3

@zebraman : 아마도 당신의 걱정거리 중 가장 적습니다. 프로필을 작성하고 소요 시간을 확인하십시오. – UncleBens

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