2014-12-02 3 views
0

저는 C++을 처음 접했고 에서 copy()을 사용하여 하나의 문자열로 문자열을 연결하는 방법이 있는지 궁금합니다. 당신이 할 수없는copy()로 문자열 연결하기

s.insert(s.end(), v.begin(), v.end()); 

답변

3

코드 샘플의 문제는 : 나는 accumulate()을 사용할 수 있습니다 알고 있지만,이 코드와 함께 "후드"잘못 궁금해 :

string concat_v (const vector<string>& v) { 
    string s; 
    copy(v.begin(), v.end(), back_inserter(s)); 
    return s; 
} 

또는과 stringchar을 기대하는 것으로 복사하십시오. 이 같은 문제입니다 :

string s = "Hello"; 
char ch = s;   // ??? 

std::accumulate 기능을 사용하면 내가 방법 : 그것을 사용하는 방법이 있는지 당신은 여전히 ​​궁금해하는 이유를 모르겠어요되는 요청 정확히 수행합니다

string s; 
s = std::accumulate(v.begin(), v.end(), s); 

operator+을 호출하여 누적을 수행합니다. 또한 사용자가 제공하는 사용자 정의 함수를 호출하는 누적 버전이 있습니다.

+0

그는 어떻게 사용하는지 모른다 ('operator +'대 바이너리 버전). 나는 그것을 찾아야 만했다. (나는 너와 같은 사람들에게서 깔끔한 것들을 많이 배운다.) – jww

+0

@jww added example –

0

한 라이너를 찾으려면 accumulate을 사용하십시오. 네가 언급 한 두 가지 방법이 있다고 나는 생각하지 않는다. 당신이 중간의 비트와 함께 그렇게 할 수

string concat_v (const vector<string>& v) { 
    string s; 
    s = accumulate(v.begin(), v.end(), string()); 
    return s; 
}  
+1

작성한대로 작동하지 않을 것이라고 생각합니다. 'std :: accumulate'는 세번째 인자의 타입을 누적기로 사용하고, 함수 템플릿에 인자로 전달 될 때'' "의 타입은'char const *'입니다. 세 번째 인수'std :: string()'을 만들 것입니다. –

1

당신이 정말 대신 std::accumulatestd::copy으로 일을하려면 , 같은 std::stringstream 등 :

이 특정 목적을 위해
string concat_v (const vector<string>& v) { 
    stringstream s; 
    copy(v.begin(), v.end(), ostream_iterator<string>(s)); 
    return s.str(); 
} 

, 모든 입력이 동일한 유형이고 추가 연산자를 지원하는 경우 (그리고 원하는 작업을 수행하는 경우) accumulate이 확실한 선택입니다. 연결 문자열을 원한다면 문자열 스트림을 사용하는 것이 더 좋을 수 있습니다. 예를 들어 항목을 추가하면 완전히 다른 결과가 발생할 수도 있습니다 (예 : {1, 2, 3}을 (를) 포함하는 int 배열을 내보내려는 경우) 123 또는 1 2 3으로, 6이 아님).

0

std :: accumulate를 사용하면 성능 측면에서 눈에 띄는 이점이 있습니다.

누적에서는

while (first!=last) { 
    init = init + *first; 
    ++first; 
    } 

'는 초기화하기'동작 + 호출의 결과이며 연결된 문자열 축적되어있다. 이는 중간 결과마다 임시 변수를 할당하지 않으며 복사하지도 않기 때문에 좋습니다. 물론 문자열 크기를 조정할 때 사본이 생성 될 수 있지만 다른 문제입니다.

성능 차이는 중요하지 않습니다.