2014-05-12 2 views
-4

내 응용 프로그램에서 이중 벡터 STD::VECTOR<STD::VECTOR<STD::STRING>> List, 내가 목록에 두 개의 배열을 가지고 있습니다. 첫 번째 배열은 55 개의 요소를 포함하고 두 번째 배열은 48 개의 요소를 포함합니다. 이제 List의 첫 번째 배열에 처음 20 개의 요소를 유지하고 두 번째 배열에 나머지 35 개의 요소를 보내 83 (35 + 48) 개의 요소로 만들어야합니다. 나에게 최적화 된 방법을 제안 해주세요. 나는 자전거 타기를 시도했다. 그러나 나에게 너무 긴 코드와 시간이 걸리게했다. 똑같이 직접적인 조언이 있다면 조언 해주세요. 저는 VS2010에서 C++ 코드를 사용하고 있습니다. 미리 감사드립니다.더블 벡터 크기 조정

+3

당신이 무엇을 가장 확실히되지 않습니다 : 여기에

는 단순화 된 예입니다. 모든 대문자로 코드를 작성하면 문제가 발생할 수 있습니다. 그래서 우리가 실제로 가지고있는 것을 보여주십시오. 문제를 해결하기 위해 작성한 코드를 표시하고 문제가 발생한 위치를 보여줍니다. – Bart

+0

이 질문은 부탁을받는 것이지만 효율성을 높이기위한'std :: move'와'emplace_back'의 역할에 대한 올바른 지적을 제기합니다. –

+0

나는 이것을 "double vector"라고하지 않을 것입니다 ... 제목에서'std :: vector '에 대해 말하고 있다고 가정했습니다. 중첩 벡터 나 벡터 벡터 같은 용어는 더 적절할 수 있습니다. – Rook

답변

1

emplace_back(std::move(x))은 가장 효율적인 방법입니다.

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <iterator> 

using namespace std; 


int main() 
{ 
    vector<string> v1 { "The", "cat", "sat" }; 
    vector<string> v2 { "My", "dog", "barks", "a", "lot", "on", "the", "mat" }; 

    auto split = find(begin(v2), end(v2), "on"); 
    for (auto i = split ; i != v2.end() ; ++i) { 
     v1.emplace_back(std::move(*i)); 
    } 
    v2.erase(split, end(v2)); 

    copy(begin(v1), end(v1), ostream_iterator<string>(cout, " ")); 
    cout << endl; 

    copy(begin(v2), end(v2), ostream_iterator<string>(cout, " ")); 
    cout << endl; 


} 
+0

'std :: move'와 함께'emplace' 함수를 사용하지 않았습니다. 고마워. – Rook

+0

당신이 그들을 옮긴 후에 소스 목록에서 무효화 된 요소를 지우는 것을 잊지 마십시오 (예를 들어, 제 대답을 업데이트하기 전에했던 것처럼 ...) –