2009-12-31 10 views
20

나는 Accelerated C++을 읽었으며 흥미로운 책이라고해야만합니다.문자열의 벡터 합치기

제 6 장에서는 < 알고리즘 >의 함수를 사용하여 < 문자열 >을 단일 문자열로 연결해야합니다. 누적을 사용할 수는 있지만 문자열 컨테이너는 push_back 문자 만 사용할 수 있기 때문에 도움이되지 않습니다.

int main() { 
    using namespace std; 
    string str = "Hello, world!"; 
    vector<string> vec (10, str); 
    // Concatenate here? 

    return 0; 
} 

어떻게 문자열을 함께 결합합니까?

+0

무엇을 묻는 중입니까? – tster

답변

48

을이 질문 6.8입니다 가정, 당신이 사용할 필요가 말하지 않는다 누적 - 라이브러리 알고리즘을 사용합니다. 그러나 축적를 사용할 수 있습니다

#include <numeric> 

int main() { 
    string str = "Hello World!"; 
    vector<string> vec(10,str); 
    string a = accumulate(vec.begin(), vec.end(), string("")); 
    cout << a << endl; 
} 

, 두 번째 매개 변수로 첫 번째 매개 변수의 값 '발'모두를 위해 다음 세 번째 매개 변수에 '합'을 설정하고, 수행 축적이 모든 수행

sum = sum + val 

그러면 'sum'을 반환합니다. 사실 누적은 <numeric>에 선언되어 있지만 구현하는 모든 항목에 적용됩니다. operator+()

+0

감사합니다. 제 3 매개 변수와 함께 누적을 사용하여 시도해 보았습니다. 작동하지 않았습니다. 또한 back_inserter도 실패했습니다. 어떻게 작동하는지 설명해 주시겠습니까? 고마워. – Bogdan

+1

.begin()에서 .end()까지 벡터의 각 요소를 가져 와서 임시로 전달 된 빈 std :: string 인 세 번째 매개 변수에 누적시킵니다. std :: acumulate()의 반환 값은 누적 결과이며 값으로 전달됩니다. –

+3

Btw,이 접근법은 아마도 복사/재사용이 수반 될 수 있기 때문에 매우 나쁘다. – sellibitze

6

질문에 대한 확신이 없습니다. 어디에 문제가 있습니까? 루프의 문제입니다.

#include<vector> 
#include<string> 
#include<iostream> 

int main() 
{ 
    std::string str = "Hello World!"; 
    std::vector<string> vec (10,str); 

    for(size_t i=0;i!=vec.size();++i) 
     str=str+vec[i]; 
    std::cout<<str; 
} 

편집 : <algorithm>

에서

사용 for_each()이 시도 :

#include<vector> 
#include<string> 
#include<iostream> 
#include<algorithm> 
using namespace std; 
string i; 
void func(string &k) 
{ 
    i+=k; 
} 
int main() { 
    string str = "Hello World!"; 
    vector<string> vec (10,str); 

    for_each(vec.begin(),vec.end(),func); 
    cout<<i; 
    return 0; 
    } 
+1

이렇게하려면 알고리즘 헤더의 함수를 사용해야합니다. – Bogdan

+0

그것은 좋지 않다. 그러나 나는 그것이 작동 한다을 추측한다. ty – Bogdan

+0

그 자체가 문제가 아니다. xD –

12

std :: copy는 어떨까요?

std::ostringstream os; 
std::copy(vec_strings.begin(), vec_string.end(), ostream_iterator<string>(os)); 
cout << os.str() << endl; 
6

다음 코드는 ++ 2012 비주얼 C에서 컴파일하고 람다 함수를 사용

int main() { 
    string str = "Hello World!"; 
    vector<string> vec (10,str); 

    stringstream ss; 
    for_each(vec.begin(), vec.end(), [&ss] (const string& s) { cat(ss, s); }); 
    string a = ss.str(); 

    cout << a << endl; 
} 

1 답의 accumulate 예는 우아하지만, sellibitze가 지적했듯이, 각 연결에 재 할당 및 O (N²)의 비늘. 이 for_each 발췌 문장은 O (N) 정도의 크기입니다. 100K 문자열로 두 솔루션을 모두 프로파일 링했습니다. accumulate 예는 23.6 초가 걸렸지 만이 for_each 발췌 문장은 0.054 초 걸렸다.

+1

'std :: sring' 호출'reserve (final-size)'를 만든 다음 버퍼가 이미 올바른 크기이므로'+ ='를 사용하는 것이 더 빠를 수도 있습니다. –