저는 C++을 처음 접했고 에서 copy()
을 사용하여 하나의 문자열로 문자열을 연결하는 방법이 있는지 궁금합니다. 당신이 할 수없는copy()로 문자열 연결하기
s.insert(s.end(), v.begin(), v.end());
저는 C++을 처음 접했고 에서 copy()
을 사용하여 하나의 문자열로 문자열을 연결하는 방법이 있는지 궁금합니다. 당신이 할 수없는copy()로 문자열 연결하기
s.insert(s.end(), v.begin(), v.end());
코드 샘플의 문제는 : 나는 accumulate()
을 사용할 수 있습니다 알고 있지만,이 코드와 함께 "후드"잘못 궁금해 :
string concat_v (const vector<string>& v) {
string s;
copy(v.begin(), v.end(), back_inserter(s));
return s;
}
또는과 string
을 char
을 기대하는 것으로 복사하십시오. 이 같은 문제입니다 :
string s = "Hello";
char ch = s; // ???
std::accumulate
기능을 사용하면 내가 방법 : 그것을 사용하는 방법이 있는지 당신은 여전히 궁금해하는 이유를 모르겠어요되는 요청 정확히 수행합니다
string s;
s = std::accumulate(v.begin(), v.end(), s);
operator+
을 호출하여 누적을 수행합니다. 또한 사용자가 제공하는 사용자 정의 함수를 호출하는 누적 버전이 있습니다.
한 라이너를 찾으려면 accumulate
을 사용하십시오. 네가 언급 한 두 가지 방법이 있다고 나는 생각하지 않는다. 당신이 중간의 비트와 함께 그렇게 할 수
string concat_v (const vector<string>& v) {
string s;
s = accumulate(v.begin(), v.end(), string());
return s;
}
작성한대로 작동하지 않을 것이라고 생각합니다. 'std :: accumulate'는 세번째 인자의 타입을 누적기로 사용하고, 함수 템플릿에 인자로 전달 될 때'' "의 타입은'char const *'입니다. 세 번째 인수'std :: string()'을 만들 것입니다. –
당신이 정말 대신 std::accumulate
의 std::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
이 아님).
std :: accumulate를 사용하면 성능 측면에서 눈에 띄는 이점이 있습니다.
누적에서는
while (first!=last) {
init = init + *first;
++first;
}
'는 초기화하기'동작 + 호출의 결과이며 연결된 문자열 축적되어있다. 이는 중간 결과마다 임시 변수를 할당하지 않으며 복사하지도 않기 때문에 좋습니다. 물론 문자열 크기를 조정할 때 사본이 생성 될 수 있지만 다른 문제입니다.
성능 차이는 중요하지 않습니다.
그는 어떻게 사용하는지 모른다 ('operator +'대 바이너리 버전). 나는 그것을 찾아야 만했다. (나는 너와 같은 사람들에게서 깔끔한 것들을 많이 배운다.) – jww
@jww added example –