2012-10-31 4 views
4

하나의 문자열을 병합해야하는데, 효율적인 이유 때문에이 상황에서 move semantic을 사용하고 싶습니다. 물론 그 문자열은 더 이상 사용되지 않습니다. 그래서 나는 그것을 출력C++ : 문자열에서 문자열 이동 # append

Hello, World! 
## NOTHING ## 

하지만 operator+=에 의해 append를 교체 할 경우 실제로 출력

Hello, World! 
World! 

그것은 같은 일이 발생할 것입니다 가정

#include <iostream> 
#include <algorithm> 
#include <string> 

int main() 
{ 
    std::string hello("Hello, "); 
    std::string world("World!"); 
    hello.append(std::move(world)); 
    std::cout << hello << std::endl; 
    std::cout << world << std::endl; 
    return 0; 
} 

을 시도했다. 그 일을하는 올바른 방법은 무엇입니까?

나는 당신이 다른 stringstring에 일부을 이동할 수 없습니다 데비안 6.10

답변

7

에 g ++ 4.7.1 사용합니다. 그럴 경우 새로운 string에는 현재 저장소 버퍼와 새로운 저장소 버퍼가 실제로 있어야합니다. C++ 11은 std::string인접한 메모리에 있어야하므로 마술처럼이 모든 것을 연속적으로 만들어야합니다.

간단히 말해서, 당신은 할 수 없습니다.

+0

"C++ 11에서는 std :: string에 인접한 메모리가 있어야합니다"... ** 모든 종류의 C/C++에서는 문자열이 메모리에서 연속적이어야 함 **, 문자열은 BYTE/말. 따라서 어떤 상황에서도'sz = str.c_str();을 사용하여 반복 할 수 없기 때문에 인접하지 않을 수 없습니다. while (* sz) {++ sz; }'. – CodeAngry

+0

@Claudrian : * 개념적 * 문자열은 일련의 문자입니다. 인접성은 요구되지 않는다. 문자열 * 리터럴 *은'\ 0' 문자로 끝나는 연속 된 문자 배열입니다. 'std :: string' 또한 인접한 문자 배열입니다. SGI STL'rope' 클래스는 확실히 문자열이지만 연속적인 메모리에 있어야한다는 요구 사항은 없습니다. 사실 그것은 모든 요점 : 임의의 위치에서 빠른 삽입 성능을 갖는 것입니다. –