2009-08-16 5 views
2

간단한 질문 : 문자열이 있는데 머리글과 꼬리 문자열 (시작 부분과 끝에있는 문자열)을 추가하려면 가장 좋은 방법은 무엇입니까? 이 같은 뭔가 :C++ 문자열 추가

std::string tmpstr("some string here"); 
std::string head("head"); 
std::string tail("tail"); 
tmpstr = head + tmpstr + tail; 

그것을 할 수있는 더 좋은 방법이 있나요?

미리 감사드립니다.

+0

'연산자 +()'의 결과는 항상 임시 값 (rvalue)입니다. C++ 1x rvalue reference가 없다면, 결과를 더 이상 수정할 필요가 없다면 결과를 객체에 복사하는 대신 const 참조에 저장하여 하나의 엄청난 복사를 최적화 할 수 있습니다 :'const T & result = a + b;'이것은 임시를 refrence에 바인딩하고 그에 따라 수명을 연장합니다. 어쨌든 컴파일러가이 복사본을 최적화 할 수도 있지만 (문자열로는 생기지 않습니다.), 아무 것도 얻을 수 없으므로이 기술을 사용하면 성능이 저하되지 않습니다. – sbi

답변

21

당신이 효율성에 대해 우려하고 있었고, + 연산자에 의해 만들어진 임시 복사본을 방지하기 원한다면, 당신은 할 수

삽입/추가를 수행하기 전에 모든 재 할당이 한 번만 수행되도록하십시오.

그러나 원본 코드는 읽기 쉽고 간단합니다. 때로는 더 효율적이지만 읽기 어려운 솔루션보다 "더 나은"것입니다.

+0

프로필러로 확인했습니다.컴파일러에 달려 있지만 내 경우에는이 방법이 훨씬 더 효율적입니다. – Andrew

-1

당신은 꼬리를 추가하고 다음과 같이 문자열을 cocatenate 수 :

tmpstr.append(tail); 
tmpstr = head + tmpstr; 

아마 그 시점에서 새로운 문자열을 만드는 것이 더 효과적입니다.

tmpstr.insert(0, head); 
tmpstr.append(tail); 

을 그리고 당신은 더 많은 관심 효율성에 대한 있다면, 당신은 수도 :

std::string finalstr(head.length() + tmpstr.length() + 1); 
finalstr = head + tmpstr; 
+0

음,'std :: string' ctor는'std :: string :: size_type'을 가져 와서 정말로 이것을 예약합니까 ??? (게으름 때문에 미안하다.) – sbi

+0

좋아, 오늘 아침에 찾아 보니'std :: string :: size_type' 만 사용하는 ctor가 없으므로 코드 잘못된 것입니다. (당신은 * dctor를 사용한 후에'reserve() '를 호출해야합니다.) – sbi

+0

사용할 수있는 (size_t, char) 생성자가 있습니다. 나는 당신이 이해했다고 생각했기 때문에 쉼표와 '\ 0'을 생략했습니다. length()는 특수한 형식이 아닌 문자열의 길이를 반환합니다. – jkeys

1

전혀 다른 접근 방식 :

#include <iostream> 
#include <string> 
#include <sstream> 

int 
main() 
{ 
    std::string tmpstr("some string here"); 
    std::ostringstream out; 
    out << head << tmpstr << tail; 
    tmpstr = out.str(); // "headsome string heretail" 

    return 0; 
} 

이 방법의 장점은 < <가 오버로드 된 연산자에 대한 모든 유형을 혼합 문자열로 배치 할 수 있다는 것입니다.

std::string tmpstr("some string here"); 
    std::ostringstream out; 
    int head = tmpstr.length(); 
    char sep = ','; 
    out << head << sep << tmpstr; 
    tmpstr = out.str(); // "16,some string here"