>source

두 개 있어요표준::벡터에스. 아래와 같이 for 루프 기반 범위를 사용하여 첫 번째 벡터에 두 번째 벡터를 추가하고 있습니다.

std::vector<int> vec1{1,2,3,4};
std::vector<int> vec2{5,6,7};
for(int &amp;
elem2: vec2)
{
    vec1.push_back(elem2);
}
//print the elements
for(const int&amp;
 elem:vec1)
{
    std::cout<<elem<<std::endl;
}

내 프로젝트에서 벡터는100항목이 s이고 여러 곳에서 이 루프를 사용하고 있습니다. 현재 내가 원할 때마다 벡터를 병합할 참조로 두 벡터를 전달할 수 있도록 이 루프를 함수에 넣었습니다. 하지만 이 수동 방식보다 더 효율적일 수도 있고 그렇지 않을 수도 있는 이 작업을 수행하기 위한 내장 기능이 있는지알고 싶습니다.

표준::복사? 또한 먼저 결합된 길이의 크기를 조정/예약하고 싶을 수도 있습니다.

HolyBlackCat2022-01-10 06:55:27

vec1.insert( vec1.end(), vec2.begin(), vec2.end() ); 삽입에 대해 읽어보세요.

Taron2022-01-10 06:58:25

주어진 예는 본질적으로 한 벡터를 다른 벡터의 끝에 삽입하는 퇴화된 병합 사례입니다. 이를 위해 std::vector::insert를 사용할 수 있습니다. 실제로 정렬된 병합을 수행하려면 더 적절한 예를 보여야 합니다.

paddy2022-01-10 06:58:49

효율성의 한 형태인 code가 더 깨끗해집니다.

paddy2022-01-10 07:03:24

어지럽힐 필요가 없습니다. it + old_Size ->vec1.end(), 그래서 vec1.insert(vec1.end(), vec2.begin(), vec2.end()); 완료. 쉬운. 문서 페이지

user45813012022-01-10 07:31:07
  • 답변 # 1

    이를 수행하는 한 가지 가능한 방법은 다음을 사용하는 것입니다.표준::복사_n아래와 같이 알고리즘에서:

      std::vector<int> vec1{1,2,3,4};
        std::vector<int> vec2{5,6,7};
        std::vector<int>::size_type old_Size= vec1.size();//save the old size of first vector
        vec1.resize( old_Size + vec2.size());//resize the first vector
        //use std::copy_n
        std::copy_n(vec2.begin(), vec2.size(), vec1.begin() + old_Size);
    

    또 다른 옵션은 표준::벡터::삽입.

    std::vector<int>::size_type old_Size= vec1.size();
    std::vector<int>::iterator it= vec1.begin();
    vec1.insert(it + old_Size, vec2.begin(), vec2.end());
    

    크기 조정 + 복사를 사용하면 항목이 이중 초기화되며, 일반적으로 더 효율적이고 간단한 옵션이 있을 때 바람직하지 않습니다(예: 벡터::반복자가 있는 삽입).

    paddy2022-01-10 07:00:48

    @paddy 그래서 std::vector::size_type old_Size= vec1.size(); std::vector::iterator it= vec1.begin(); vec1.insert(it + old_Size, vec2.begin(), vec2.end()); 내 대답의 첫 번째 접근 방식보다 더 효율적입니까?

    Anoop Rana2022-01-10 07:17:27

    왜 반대? 내 대답에는 잘못된 것이 없습니다.

    Anoop Rana2022-01-10 07:22:27

    @paddy OP는 내장 기능에 대해 물었고 그에 따라 대답했습니다. 특히 OP는 생산 준비 code를 원한다고 말한 적이 없습니다.

    Anoop Rana2022-01-10 07:30:50

    @AnoopRana 이 두 가지 방법을 모두 보여주셔서 감사합니다.

    Anya2022-01-10 07:42:55
  • 답변 # 2

    또 다른 가능한 답변:

    std::copy(vec2.begin(), vec2.end(), std::back_inserter(vec1));
    

    다음을 확인하십시오. https://en.cppreference.com/w/cpp/algorithm/copy그리고 https://en.cppreference.com/w/cpp/iterator/back_inserter

    사용back_inserter뒤에 삽입하기 위한 반복자를 생성하려면vec1, 필요한 경우 자동으로 메모리를 할당합니다.

  • 이전 javascript : 비동기 파일 읽기, 반환하기 전에 함수를 완료할 수 없음
  • 다음 Webpack Dev Server Config -최신 버전에서 contentBase가 작동하지 않음