2010-03-17 3 views
1

가 나는 표준 : :지도를 가지고있다. 분명히, 나는통과 문자열 성병 문자 :지도 :: 찾기 (..)

.find("blah"); 

그러나, 내가 대신 문자열을 하드 코딩, 그것은 선행 선언하고 싶었 같은 리터럴 문자열을 전달할 수 있습니다, 그래서 지금은 선택의 몇 가지 있습니다

const std::string mystring = "blah"; 
const char mystring[] = "blah"; 
static const char * mystring = "blah"; 

그들은 모두 작업 . (또는 최소한 컴파일). 제 질문은, 어느 것을 사용해야합니까? 다른 쪽의 이점/비산 거리는 무엇입니까?

static const std::string mystring("blah"); 

그 방법을 문자열 모두 읽기 전용 및 초기화 :

+1

지도를 어떻게 선언하고 있습니까? – Bill

+5

첫 번째 문자열을 제외하고는 모두 괜찮습니다.'const std :: string mystring = "blah";'. 주관적인 선택입니다. – AraK

답변

2

장점과 disadvantatges : 이것은 꽤 많은 문자열을 처리하는 표준 C++ 방법입니다

const std::string mystring = "blah";

. 당신은 이것으로 문자열로 할 필요가있는 모든 것을 할 수 있습니다. 가장 큰 단점은 속도가 느리다는 것입니다. 거기에 동적 할당이 있습니다. 또한 .find이 장면 아래 char[]에 의존하면 힙 작업을 모두 낭비하게되고 내부적으로 사용할 수있는 배열을 얻으려면 더 많은 작업을해야 할 수도 있습니다. 이 좋은 빠른 그래서

const char mystring[] = "blah";

이는 스택에 5 바이트 문자열을 할당합니다. 단점은 .find이 std :: string을 사용하는 경우, 어쨌든 할당을해야한다는 것이며, 여기서 한 번만 호출하는 대신 모든 호출을 수행한다는 것입니다. 또한, 다른 것들을해야한다면 (예 : catenate ".txt"), std :: string을 사용하는 것이 훨씬 쉬울 것입니다. 이 외부 범위에있는 경우

static const char * mystring = "blah";

이는 소스 파일의 로컬 유지 것을 의미한다. 이 작업을 수행하는 C++ 방법은 static 대신 이름없는 네임 스페이스를 사용하는 것입니다. 이 방법을 사용하는 유일한 이점은 C와 호환된다는 것입니다 (또는 적어도 "const"가 무엇인지 아는 새 컴파일러로 최소한).

일반적으로 std :: string을 사용합니다. 특별하거나 극단적 인 경우를 제외하고 사용의 용이성은 속도보다 우선합니다.

+0

지도입니다 : std :: map , 여전히 확실하지 않습니다. char []로 변환 되나요? – ra170

+1

잘 모르겠 으면 std :: 끈. –

2

난 당신이 지정하지 않은 옵션과 함께 갈 것

(이것은 가정 당신의 mapkey_typestd::string입니다) 한 번만.

0

나는, 그 첫 번째는 더 효율적인지도가 (내가 세 가지 선택이 컴파일하는 것이 있어야합니다 생각) std::string에 의해 키가 있습니다 가정

const char * const mystring = "blah"; 
6

선호 할 것입니다. 단일 문자열 객체를 만들고 find을 호출 할 때마다 참조로 전달합니다. 나머지 문자열은 각각 find에 대해 임시 문자열 개체를 만듭니다.