2015-01-02 2 views
0

문자열 입력을 사용자가 받아서 C++의 벡터 (첫 번째)에 넣는 것보다 (예 : string이 "038493"인 경우) 먼저 [0]에 액세스하면 우리는 어떻게 더 빨리 할 수 ​​있습니다.사용자가 입력 한 문자열을 벡터에 넣는 것보다

string p; 
    cin>>p; 

    for(i=0;i<n;i++){ 
    first.push_back(p[i]); 
    } 

나는 이것을 사용했지만 느리다. 나에게 좋은 방법을 말해줘. n은 실제로 전체 문자열의 길이 인 경우

+0

' 처음으로 (p.begin(), p.end());' – juanchopanza

+5

문자열이 매우 큰 경우가 아니면 병목 현상이 발생하지 않습니다. 너 뭐하려고? 왜 천천히 생각하니? @ juanchopanza의 메소드는'1' heap allocation을 필요로하지만 당신은'O (log p.size())'할당을 필요로합니다. 'p'의 크기가 큰 차이가 나는가? – Pradhan

+0

아마도 관련이 있습니다 - [ "C++ 프로그램에서 scanf()를 사용하는 것이 cin을 사용하는 것보다 빠릅니까?"] (http://stackoverflow.com/questions/1042110/using-scanf-in-c-programs-is-faster-than- using-cin). – Pradhan

답변

1
first.insert(first.end(), p.begin(), p.begin() + n); 

, 그것을 사용하는 것이 좋을 것 :

first.insert(first.end(), p.begin(), p.end()); 
0

//`(문자 & C : P)에 대한 {첫번째 //. push_back (c); //}

사과, 나는 잘못 생각했다. 이 생성자를 벡터에 사용하면 가장 빠른 방법이라고 생각합니다. Juan은 올바른 생각을 가지고 있습니다.

std::vector<char> first(p.begin(), p.end()); 
+1

답변 뒤에있는 이론을 약간 설명하고 싶을 수도 있습니다. –

0

가장 빠름 : 아무 것도하지 않습니다. std::string은 기본적으로 대부분의 용도로 std::vector<char>의 기능을 수행 할 수 있으며, 문자 그대로 아무것도하지 않는 것은 항상 뭔가를하는 것보다 빠를 것입니다.

std::string p; 
cin >> p; 

// just use p 
// p[0] is the first char, e.g. '0', so you don't have to do anything 
// p[1] is the second, etc. 
// p.size() is the size 

다음 빠른 : 있는지 확인합니다

std::vector<char> data(p.begin(), p.end()); 

는 (적어도 p.size()의) 정확한 양의 단 하나 개의 할당을 수행하고로 문자열을 복사합니다 : 그냥 직접 벡터를 구축 가능한 한 효율적으로 벡터.

다음 : 한 번에 각 문자 하나를 추가 : 직접 시공 방법에 반대

// C++11 
std::vector<char> data; 
for (char c : p) { 
    data.push_back(c); 
} 

// C++03 
for (size_t i = 0; i < data.size(); ++i) { 
    data.push_back(p[i]); 
} 

문자열이 길수록 더 추가 할당/복사가 완료됩니다. 정확한 양은 구현에 따라 다르지만,이 접근법은 항상 더 느릴 것입니다 - 특정 구현의 기본 설정이라 할지라도 큰 초기 용량을 가진 벡터를 구성합니다 (push_back을 분기해야만하므로 resize인지 확인해야합니다 ...). 직접 건설은 그렇게 할 필요조차 없다).

관련 문제