2017-05-05 13 views
0

효율적으로 여러 개의 작은 문자열을 std::string에 연결해야한다는 요구 사항이 있습니다. std :: string에서 문자열을 연결하는 옵션

는의 다섯 문자열 abc, def, ghi, lmnpqr가 있다고 가정 해 봅시다. 이 따라서 연결된 할 필요가 : pqr, lmn, ghi, defabc : /abc/def/ghi/lmn/pqr

문자열이 연결된 문자열의 최종 위치와 반대 순서로 수신 할 수있다.

이 작업을 효율적으로 수행하려면 모든 문자열의 크기를 알고 있으므로 reserve() API를 std::string으로 사용합니다.

효율적입니다 둘 중 어떤이 모든 것을 감안할 때 :

  1. 은 문자열을 저장하고 하나 하나 터지는하여 그들을 연결하는 스택을 사용합니다.

  2. std::stringinsert() API를 사용하여 나머지 문자열을 처음부터 새 문자열을 수용하도록 이동하십시오.

연결될 문자열의 수는 최대 2,000 개입니다.

+6

중 최선의 선택인가? –

+3

http://www.cplusplus.com/reference/sstream/stringstream/을보십시오. "<<"연산자가 오버로드됩니다. 성능면에서 조기 최적화에주의하십시오. 구현 및 프로파일 링. 의심스러운 경우 다시 구현하십시오. – mutex36

+0

방법 1이 제대로 구현 되었다면 적어도 방법 2보다 느리지는 않습니다 – Slava

답변

1

호기심에서 벗어난이 프로그램은 데비안에서 다양한 방법으로 실행되는 시간을 확인할 수 있도록이 프로그램을 작성했습니다. 역순으로 스택에 10 만 개 단어를 추가하려면 왜 그냥 두 가지 방법을 구현하고 프로파일하지 않는이

// concatenate by + operator 
real 0m2.286s 
user 0m2.268s 
sys  0m0.016s 

// concatenate by insert 
real 0m0.695s 
user 0m0.692s 
sys  0m0.000s 

// concatenate by stack 
real 0m0.051s 
user 0m0.044s 
sys  0m0.004s 

#include <cstdio> 
#include <iostream> 
#include <string> 
#include <random> 
#include <algorithm> 
#include <stack> 

using namespace std; 

int main() { 
    random_device dev; 
    mt19937 gen(dev()); 
    string chars = "abcdefghijklmnopqrstuvwxyz"; 
    uniform_int_distribution<> dis_index(0, chars.size()-1); 
    int size = 3; // word size 
    int count = 100000; // 100K words 
    string out; // final string 
    stack<string> st; 

    int i = 0; 
    while (i < count) { 
    // create a random word of length = size 
    string s; 
    generate_n(back_inserter(s), size, [&](){return chars[dis_index(gen)];}); 
    //cout << s << endl; 

    // concatenate by + operator 
    // out = s + out; 

    // concatenate by insert 
    // out.insert(0, s); 

    // concatenate by stack 
    st.push(s); 

    ++i; 
    } 
    while (!st.empty()) { 
    out += st.top(); 
    st.pop(); 
    } 
    //cout << out << endl; 
} 
+0

필자는 내 자신의 샘플 코드를 썼고, 스택 접근법이 나의 사용 사례에 대해 약간 더 나은 것으로 나타났습니다. – Maddy