기본적으로 내 작업은 가변 길이의 문자열을 대소 문자를 구분하지 않고 정렬해야합니다. strcasecmp() cstrings을 비교하지만 문자열에서 작동하지 않는 함수가 있다는 것을 알고 있습니다. 지금은 문자열에 대해 getline()을 사용하고 있으므로 한 번에 한 줄씩 문자열을 읽을 수 있습니다. 이들을 문자열 벡터에 추가 한 다음 strcasecmp()를 호출 할 때마다 cstring으로 변환합니다. strcasecmp()와 비교하기 전에 각 문자열을 cstring으로 변환하는 대신, 미리 정의 된 char 배열 크기를 갖지 않고 cstring에 cin.getline()을 사용할 수있는 방법이 있는지 궁금합니다. 아니면, 최고의 솔루션은 단지 문자열을 읽고, cstring으로 변환하고, 벡터에 저장 한 다음 정렬하는 것입니까?거기에 이전에 char 배열 크기를 정의 할 필요없이 cin.getline()을 사용하는 방법이 있습니까?
2
A
답변
2
"convert to cstring"은 문자열의 c_str()
멤버를 사용한다는 것을 의미합니다. 그렇다면 실제로 변환이 아닌 대부분의 구현에서 단순한 접근 자일뿐입니다. 차이점은 성능에 대해 걱정하는 경우에만 중요합니다 (사용자가있는 것처럼 들리는). 내부적으로 std :: strings는 "거의 항상 그렇지만 기술적으로는 필요하지 않습니다" "cstring"으로 표현됩니다. 이 클래스는 크기를 관리하지만, 동적으로 할당 된 cstring 일뿐입니다.
직접 답하려면 : cin.getline을 사용할 때 배열의 크기를 지정해야합니다. 크기를 지정하지 않으려면 getline 및 std :: string을 사용하십시오. 이 접근 방식에는 아무런 문제가 없습니다.
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);
}
흠 stream.c_str()의 추가 줄이 상당히 느려지지는 않습니까? – zebraman
@zebraman : 아마도 당신의 걱정거리 중 가장 적습니다. 프로필을 작성하고 소요 시간을 확인하십시오. – UncleBens