두 std :: vectors 연결


687

std::vectors를 어떻게 연결 합니까?


5
주어진 답변은 실제로 연결되지 않습니다. 그들은 사본을 추가합니다. std :: vector concatenate 메소드를 작성하는 데 (효율성의 관점에서) 사용이있을 수 있지만, 노드 관리에 대한 정교한 공유가 필요할 수 있으며 이것이 아직 수행되지 않은 이유 일 수 있습니다.
FauChristian 2019

8
@FauChristian : 아니요, 효율성의 관점에서 사용하지 못할 수 있습니다. 벡터 메모리는 연속적이어야하므로 제안한 것은 불가능합니다. "노드 관리의 일부 정교한 공유"를 원하고 이러한 방식으로 벡터 클래스를 변경하려는 경우에는 결과가 나타납니다. 그럼에도 불구하고 제안 된 방식으로 메모리를 재사용하는 것은 매우 어렵지만 조금 더 실현 가능하기 시작합니다. 나는 그것이 현재 구현되어 있다고 생각하지 않습니다. 중요한 것은 관리 노드 (deque)를 공유 할 때 끝 노드가 부분적으로 비어있을 수 있다는 것입니다.
쿠키

4
@lecaruyer 당신은 당신이 복제하기 위해 2 년 전에 질문을 표시했다는 것을 알고 있습니다
eshirima

9
이것이 표준 라이브러리 로 a + b또는 a.concat(b)표준 라이브러리 로 구현되지 않은 이유가 궁금한 유일한 사람 입니까? 기본 구현은 차선책 일 수 있지만 모든 배열 연결을 미세 최적화 할 필요는 없습니다.
oseiskar

9
수년간의 진화, 모든 주류 언어의 가장 고급 연산자 오버로드, 언어의 복잡성을 두 배로하는 템플릿 시스템, 그러나 그 대답은 v = v1 + v2가 아닙니다.
Spike0xff

답변:


728
vector1.insert( vector1.end(), vector2.begin(), vector2.end() );

53
먼저 각 벡터가 보유하는 요소 수를 가져오고 vector1을 가장 큰 요소로 설정하는 코드 만 추가합니다. 그렇지 않으면 불필요한 복사가 많이 발생합니다.
Joe Pineda

34
질문이 있습니다. vector1과 vector2가 동일한 벡터 인 경우 작동합니까?
Alexander Rafferty

6
여러 벡터를 하나로 연결 한 경우 reserve먼저 대상 벡터 를 호출 하는 것이 도움이 됩니까?
Faheem Mitha

33
@AlexanderRafferty : 경우에만 vector1.capacity() >= 2 * vector1.size(). 전화하지 않으면 비정형 std::vector::reserve()입니다. 그렇지 않으면 벡터 매개 변수 2, 3로 전달 된 반복자 무효화, 재 할당됩니다
드류 Dormann에게

28
표준 라이브러리에 간결한 표현이 없다는 것은 너무 나쁩니다. .concat또는+=
nmr

193

C ++ 11을 사용 중이고 단순히 요소를 복사하지 않고 요소를 이동하려면 std::move_iteratorinsert (또는 copy)와 함께 사용할 수 있습니다 .

#include <vector>
#include <iostream>
#include <iterator>

int main(int argc, char** argv) {
  std::vector<int> dest{1,2,3,4,5};
  std::vector<int> src{6,7,8,9,10};

  // Move elements from src to dest.
  // src is left in undefined but safe-to-destruct state.
  dest.insert(
      dest.end(),
      std::make_move_iterator(src.begin()),
      std::make_move_iterator(src.end())
    );

  // Print out concatenated vector.
  std::copy(
      dest.begin(),
      dest.end(),
      std::ostream_iterator<int>(std::cout, "\n")
    );

  return 0;
}

int를 사용하는 예는 복사하는 것보다 효율적이지 않기 때문에 int가있는 예에서는 더 효율적이지 않지만 이동이 최적화 된 데이터 구조의 경우 불필요한 상태를 복사하지 않아도됩니다.

#include <vector>
#include <iostream>
#include <iterator>

int main(int argc, char** argv) {
  std::vector<std::vector<int>> dest{{1,2,3,4,5}, {3,4}};
  std::vector<std::vector<int>> src{{6,7,8,9,10}};

  // Move elements from src to dest.
  // src is left in undefined but safe-to-destruct state.
  dest.insert(
      dest.end(),
      std::make_move_iterator(src.begin()),
      std::make_move_iterator(src.end())
    );

  return 0;
}

이동 후 src의 요소는 정의되지 않았지만 파괴하기에 안전한 상태로 유지되며 이전 요소는 마지막에 dest의 새 요소로 직접 전송되었습니다.


6
std :: make_move_iterator () 메소드는 std :: unique_ptr의 std :: vectors를 연결하려고 할 때 도움이되었습니다.
Knitschi

이것과의 차이점은 무엇입니까 std::move(src.begin(), src.end(), back_inserter(dest))?
kshenoy


77

또는 다음을 사용할 수 있습니다.

std::copy(source.begin(), source.end(), std::back_inserter(destination));

이 패턴은 두 벡터가 정확히 같은 유형의 것을 포함하지 않는 경우 유용합니다. std :: back_inserter 대신 무언가를 사용하여 한 유형에서 다른 유형으로 변환 할 수 있기 때문입니다.


7
복사 방법은 그렇게 좋은 방법이 아닙니다. push_back을 여러 번 호출하므로 많은 요소를 삽입해야 할 경우 여러 개의 재 할당이 발생할 수 있습니다. 벡터 구현은 재 할당을 피하기 위해 최적화를 수행 할 수 있으므로 insert를 사용하는 것이 좋습니다. 복사를 시작하기 전에 메모리를 예약 할 수 있습니다
Yogesh Arora

7
@ Yogesh : 물론, 당신이 reserve먼저 전화를 멈추는 것은 아무것도 없습니다 . 그 이유는 std::copy당신이 아닌 다른 뭔가를 사용하고자하는 경우에 유용는 때로는 back_inserter.
Roger Lipscombe

"다중 할당"이라고 말하면, 사실이지만 할당 수가 최악의 로그 (추가 된 항목 수)에 있습니다. 즉, 항목 추가 비용은 추가 된 항목 수에서 일정합니다. (기본적으로 프로파일 링에 예약이 필요하지 않다면 걱정하지 마십시오).
Martin Bonner는 Monica를

대신 std :: transform을 사용하면됩니다.
Martin Broadhurst

1
복사는 예약 상태에서도 많은 시간을 소비합니다. vector :: insert는 모든 검사를 피합니다 : quick-bench.com/bLJO4OfkAzMcWia7Pa80ynwmAIA
Denis Yaroshevskiy

63

C ++ 11에서는 벡터 b를 a에 추가하는 것이 좋습니다.

std::move(b.begin(), b.end(), std::back_inserter(a));

ab중복되지 않고, b더 이상 사용하지 않을.


이다 std::move에서 <algorithm>의하지 보통 std::move 에서 <utility>.


10
a가 실제로 b 인 경우 정의되지 않은 동작 (이것은 결코 일어날 수 없다는 것을 알고 있으면 괜찮지 만 범용 코드에서 알아볼 가치가 있습니다).
Martin Bonner는 Monica를

1
@MartinBonner 언급 해 주셔서 감사합니다. 아마도 나는 insert더 안전한 옛날 방식으로 돌아 가야 할 것 입니다.
Deqing

15
아, 그 외 std :: move 처음봤을 때 상당히 혼란 스럽습니다.
xaxxon

1
s insert()와 다른가요 move_iterator? 그렇다면 어떻게?
GPhilo

1
std::move대부분의 사람들이이 과부하를 모르기 때문에 여기서 말하는 내용에 대한 메모를 추가했습니다 . 그것이 개선되기를 바랍니다.
YSC

38
std::vector<int> first;
std::vector<int> second;

first.insert(first.end(), second.begin(), second.end());

24

나는 이미 언급 한 것을 선호합니다 :

a.insert(a.end(), b.begin(), b.end());

그러나 C ++ 11을 사용하는 경우 일반적인 방법이 하나 더 있습니다.

a.insert(std::end(a), std::begin(b), std::end(b));

또한 질문의 일부는 아니지만 reserve더 나은 성능을 위해 추가하기 전에 사용하는 것이 좋습니다 . 그리고 벡터를 예약하지 않고 자체와 연결하면 실패하므로 항상해야합니다 reserve.


기본적으로 필요한 것 :

template <typename T>
void Append(std::vector<T>& a, const std::vector<T>& b)
{
    a.reserve(a.size() + b.size());
    a.insert(a.end(), b.begin(), b.end());
}

2
std::인수 종속 조회를 통해 추론됩니다 . end(a)충분할 것입니다.
Asu

4
@Asu ADL은의 std::유형 a이에서 오는 경우 에만 추가 std하여 일반적인 측면을 무시 합니다.
Potatoswatter

좋은 지적. 이 경우에는 벡터이므로 어쨌든 작동하지만 더 나은 솔루션입니다.
Asu

std :: begin () / end ()가 멤버 함수로 포함되지 않은 컬렉션 (예 : 배열)에 추가되었습니다. 그러나 배열에는 insert () 멤버 함수가 없으며 "insert ()가 있지만 begin ()이없는 콜렉션이 있습니까 (std :: begin ())?"라는 질문을 호출합니다.
James Curran



9

연결 의 일반적인 성능 향상 은 벡터 크기를 확인하는 것입니다. 작은 것을 큰 것을 합치거나 삽입하십시오.

//vector<int> v1,v2;
if(v1.size()>v2.size()) {
    v1.insert(v1.end(),v2.begin(),v2.end());
} else {
    v2.insert(v2.end(),v1.begin(),v1.end());
}

너무 간단하지만 아직 그런 식으로 생각하지 않았습니다!
Zimano

2
샘플 코드가 잘못되었습니다. v1.insert(v2.end()...에서 반복자 v2를 사용하여의 위치를 ​​지정하고 v1있습니다.
David Stone

빠른 스왑을 사용할 수도 있습니다. @DavidStone 연결 순서가 변경되도록 편집했습니다. 벡터의 시작 부분에 추가 할 수 있습니까?
qwr

처음에는 삽입 할 수 있지만 속도가 느려집니다. 그러나 진정으로 "연결"하기 위해서는 순서가 중요하므로 그렇게해야합니다.
David Stone

7

벡터를 간결하게 연결하려면 +=연산자에 과부하를 줄 수 있습니다.

template <typename T>
std::vector<T>& operator +=(std::vector<T>& vector1, const std::vector<T>& vector2) {
    vector1.insert(vector1.end(), vector2.begin(), vector2.end());
    return vector1;
}

그러면 다음과 같이 호출 할 수 있습니다.

vector1 += vector2;

6

강력한 예외 보장에 관심이있는 경우 (복사 생성자가 예외를 throw 할 수있는 경우) :

template<typename T>
inline void append_copy(std::vector<T>& v1, const std::vector<T>& v2)
{
    const auto orig_v1_size = v1.size();
    v1.reserve(orig_v1_size + v2.size());
    try
    {
        v1.insert(v1.end(), v2.begin(), v2.end());
    }
    catch(...)
    {
        v1.erase(v1.begin() + orig_v1_size, v1.end());
        throw;
    }
}

append_move벡터 요소의 이동 생성자가 던질 수있는 경우 (일반적으로는 아니지만) 일반적으로 강력한 보장과 마찬가지로 구현할 수 없습니다.


그렇지는 가능하다 v1.erase(...너무 던져?
클래스 스켈레톤

insert이미 이것을 처리합니다. 또한이 호출 erase은에 해당합니다 resize.
Potatoswatter

나는 이것을 좋아합니다-감사합니다!
natersoz

5

이것을 헤더 파일에 추가하십시오 :

template <typename T> vector<T> concat(vector<T> &a, vector<T> &b) {
    vector<T> ret = vector<T>();
    copy(a.begin(), a.end(), back_inserter(ret));
    copy(b.begin(), b.end(), back_inserter(ret));
    return ret;
}

이 방법으로 사용하십시오 :

vector<int> a = vector<int>();
vector<int> b = vector<int>();

a.push_back(1);
a.push_back(2);
b.push_back(62);

vector<int> r = concat(a, b);

r은 [1,2,62]를 포함합니다


왜 이것이 투표에 실패했는지 모릅니다. 가장 효율적인 방법은 아니지만 잘못이 아니고 효과적입니다.
leeor_net 2016 년

4

C ++ 11 이동 시맨틱을 사용하는 범용 솔루션은 다음과 같습니다.

template <typename T>
std::vector<T> concat(const std::vector<T>& lhs, const std::vector<T>& rhs)
{
    if (lhs.empty()) return rhs;
    if (rhs.empty()) return lhs;
    std::vector<T> result {};
    result.reserve(lhs.size() + rhs.size());
    result.insert(result.cend(), lhs.cbegin(), lhs.cend());
    result.insert(result.cend(), rhs.cbegin(), rhs.cend());
    return result;
}

template <typename T>
std::vector<T> concat(std::vector<T>&& lhs, const std::vector<T>& rhs)
{
    lhs.insert(lhs.cend(), rhs.cbegin(), rhs.cend());
    return std::move(lhs);
}

template <typename T>
std::vector<T> concat(const std::vector<T>& lhs, std::vector<T>&& rhs)
{
    rhs.insert(rhs.cbegin(), lhs.cbegin(), lhs.cend());
    return std::move(rhs);
}

template <typename T>
std::vector<T> concat(std::vector<T>&& lhs, std::vector<T>&& rhs)
{
    if (lhs.empty()) return std::move(rhs);
    lhs.insert(lhs.cend(), std::make_move_iterator(rhs.begin()), std::make_move_iterator(rhs.end()));
    return std::move(lhs);
}

이것이 appending 과 어떻게 다른지 주목하십시오 vector.


4

+ 연산자를위한 고유 한 템플릿을 준비 할 수 있습니다.

template <typename T> 
inline T operator+(const T & a, const T & b)
{
    T res = a;
    res.insert(res.end(), b.begin(), b.end());
    return res;
}

다음으로 + 만 사용하십시오 :

vector<int> a{1, 2, 3, 4};
vector<int> b{5, 6, 7, 8};
for (auto x: a + b)
    cout << x << " ";
cout << endl;

이 예제는 출력을 제공합니다.

12 34 5678 9

3
사용하는 T operator+(const T & a, const T & b)것은 위험하므로 사용 하는 것이 좋습니다 vector<T> operator+(const vector<T> & a, const vector<T> & b).
Matthieu H

4

알고리즘이 std::merge에서 C ++ (17) 매우 쉽게 사용할 수,

아래는 예입니다.

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    //DATA
    std::vector<int> v1{2,4,6,8};
    std::vector<int> v2{12,14,16,18};

    //MERGE
    std::vector<int> dst;
    std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(dst));

    //PRINT
    for(auto item:dst)
        std::cout<<item<<" ";

    return 0;
}

3
나는 사용하기가 쉽다고 생각하지 않지만 std::vector::insert다른 것 : 두 범위를 새로운 범위로 병합하는 것과 다른 벡터의 끝에 다른 벡터를 삽입하는 것. 답에서 언급 할 가치가 있습니까?
jb December

4

목표가 단순히 읽기 전용 목적으로 값의 범위를 반복하는 것이라면 대안은 두 벡터를 복사하지 않고 프록시 (O (1)) 주위로 감싸는 것입니다 (O (n)). 하나의 연속적인 것으로

std::vector<int> A{ 1, 2, 3, 4, 5};
std::vector<int> B{ 10, 20, 30 };

VecProxy<int> AB(A, B);  // ----> O(1)!

for (size_t i = 0; i < AB.size(); i++)
    std::cout << AB[i] << " ";  // ----> 1 2 3 4 5 10 20 30

'VecProxy'구현 및 장단점을 포함한 자세한 내용 은 https://stackoverflow.com/a/55838758/2379625 를 참조하십시오 .


3
vector<int> v1 = {1, 2, 3, 4, 5};
vector<int> v2 = {11, 12, 13, 14, 15};
copy(v2.begin(), v2.end(), back_inserter(v1));

6
이 코드 스 니펫은 문제를 해결할 수 있지만 질문에 왜 또는 어떻게 대답하는지는 설명하지 않습니다. 제발 코드에 대한 설명을 포함 하는 정말 귀하의 게시물의 품질을 개선하는 데 도움으로. 신고자 / 검토 자 : 이 답변과 같은 코드 전용 답변의 경우 공감하지 마십시오. (참고 :이 답변은 실제로 설명을하기에 충분히 간단 할 수 있으며, 불필요하며 불필요합니다. 더 많은 NAA / VLQ 플래그를 방지하기 위해 설명을 추가하고 싶을 수도 있습니다.)
Scott Weldon

2

나는 rvalue-references에서 이동하고 그렇지 않으면 복사하여 많은 수의 컨테이너를 연결하는이 기능을 구현했습니다.

namespace internal {

// Implementation detail of Concatenate, appends to a pre-reserved vector, copying or moving if
// appropriate
template<typename Target, typename Head, typename... Tail>
void AppendNoReserve(Target* target, Head&& head, Tail&&... tail) {
    // Currently, require each homogenous inputs. If there is demand, we could probably implement a
    // version that outputs a vector whose value_type is the common_type of all the containers
    // passed to it, and call it ConvertingConcatenate.
    static_assert(
            std::is_same_v<
                    typename std::decay_t<Target>::value_type,
                    typename std::decay_t<Head>::value_type>,
            "Concatenate requires each container passed to it to have the same value_type");
    if constexpr (std::is_lvalue_reference_v<Head>) {
        std::copy(head.begin(), head.end(), std::back_inserter(*target));
    } else {
        std::move(head.begin(), head.end(), std::back_inserter(*target));
    }
    if constexpr (sizeof...(Tail) > 0) {
        AppendNoReserve(target, std::forward<Tail>(tail)...);
    }
}

template<typename Head, typename... Tail>
size_t TotalSize(const Head& head, const Tail&... tail) {
    if constexpr (sizeof...(Tail) > 0) {
        return head.size() + TotalSize(tail...);
    } else {
        return head.size();
    }
}

}  // namespace internal

/// Concatenate the provided containers into a single vector. Moves from rvalue references, copies
/// otherwise.
template<typename Head, typename... Tail>
auto Concatenate(Head&& head, Tail&&... tail) {
    size_t totalSize = internal::TotalSize(head, tail...);
    std::vector<typename std::decay_t<Head>::value_type> result;
    result.reserve(totalSize);
    internal::AppendNoReserve(&result, std::forward<Head>(head), std::forward<Tail>(tail)...);
    return result;
}

1

찾고있는 것이 벡터를 생성 한 후 다른 벡터에 추가하는 방법이라면 vector::insert여러 번 답변 된 것처럼 가장 좋은 방법입니다.

vector<int> first = {13};
const vector<int> second = {42};

first.insert(first.end(), second.cbegin(), second.cend());

슬프게도 const vector<int>위와 같이 구성 한 다음을 구성해야합니다 insert.


실제로 찾고있는 것이이 두 개의 연결을 유지하는 컨테이너 vector<int>인 경우 다음과 같은 경우 더 나은 것을 사용할 수 있습니다.

  1. 당신 vector은 프리미티브를 포함
  2. 포함 된 프리미티브의 크기가 32 비트 이하입니다.
  3. 당신은 const컨테이너를 원한다

위의 내용이 모두 사실이라면 귀하의에 포함 된 프리미티브의 크기와 일치하는 basic_string사람을 사용하는 것이 좋습니다 . 이러한 크기가 일정하게 유지되도록하려면 코드에를 포함시켜야합니다 .char_typevectorstatic_assert

static_assert(sizeof(char32_t) == sizeof(int));

이 사실을 유지하면 다음과 같이 할 수 있습니다.

const u32string concatenation = u32string(first.cbegin(), first.cend()) + u32string(second.cbegin(), second.cend());

차이점 string과 차이점에 대한 자세한 내용은 https://stackoverflow.com/a/35558008/2642059를 참조vector 하십시오.

이 코드의 실제 예를 보려면 여기를 참조하십시오. http://ideone.com/7Iww3I


0

이 솔루션은 약간 복잡하지만 제공 할 수있는 boost-range다른 멋진 기능도 있습니다.

#include <iostream>
#include <vector>
#include <boost/range/algorithm/copy.hpp>

int main(int, char**) {
    std::vector<int> a = { 1,2,3 };
    std::vector<int> b = { 4,5,6 };
    boost::copy(b, std::back_inserter(a));
    for (auto& iter : a) {
        std::cout << iter << " ";
    }
    return EXIT_SUCCESS;
}

종종 의도는 벡터를 결합 하고 일부 작업을 수행하면서 벡터 ab반복하는 것입니다. 이 경우 말도 안되는 간단한 join기능이 있습니다.

#include <iostream>
#include <vector>
#include <boost/range/join.hpp>
#include <boost/range/algorithm/copy.hpp>

int main(int, char**) {
    std::vector<int> a = { 1,2,3 };
    std::vector<int> b = { 4,5,6 };
    std::vector<int> c = { 7,8,9 };
    // Just creates an iterator
    for (auto& iter : boost::join(a, boost::join(b, c))) {
        std::cout << iter << " ";
    }
    std::cout << "\n";
    // Can also be used to create a copy
    std::vector<int> d;
    boost::copy(boost::join(a, boost::join(b, c)), std::back_inserter(d));
    for (auto& iter : d) {
        std::cout << iter << " ";
    }
    return EXIT_SUCCESS;
}

큰 벡터의 경우 복사가 없으므로 이점이 될 수 있습니다. 또한 일반화를 둘 이상의 컨테이너로 쉽게 복사하는 데 사용할 수 있습니다.

어떤 이유로 boost::join(a,b,c)합리적인 것은 없습니다 .


0

다형성 유형 사용을위한 템플릿을 사용하여 사전 구현 된 STL 알고리즘으로이를 수행 할 수 있습니다.

#include <iostream>
#include <vector>
#include <algorithm>

template<typename T>

void concat(std::vector<T>& valuesa, std::vector<T>& valuesb){

     for_each(valuesb.begin(), valuesb.end(), [&](int value){ valuesa.push_back(value);});
}

int main()
{
    std::vector<int> values_p={1,2,3,4,5};
    std::vector<int> values_s={6,7};

   concat(values_p, values_s);

    for(auto& it : values_p){

        std::cout<<it<<std::endl;
    }

    return 0;
}

더 이상 사용하지 않으려면 두 번째 벡터를 지울 수 있습니다 ( clear()메서드).


-1

하나의 루프로 2 std::vector-s를 연결하십시오 .forstd::vector

예:

std::vector <int> v1 {1, 2, 3};//declare vector1
std::vector <int> v2 {4, 5};//declare vector2
std::vector <int> suma;//declare vector suma

for(int i = 0; i < v1.size()-1;i++)//for loop 1
{
     suma.push_back(v1[i]);
}

for(int i = 0; i< v2.size()-1;i++)/for loop 2
{
     suma.push_back(v2[i]);
}

for(int i = 0; i < suma.size(); i++)//for loop 3-output
{
     std::cout<<suma[i];
}

에이 코드를 작성하십시오 main().


당신 for루프는 잘못이다. 벡터의 유효한 인덱스는 0 ~ size()-1입니다. 당신 루프 종료 조건이 있어야합니다 i < v1.size()사용 <하지 <=. 잘못된 조건을 사용하면 컨테이너 외부의 메모리에 액세스합니다.
Blastfurnace

작동하지 않는 것 외에도이 코드는 비 아이디 오닉입니다. auto수동 인덱싱 대신 최소한 반복자를 사용해야 합니다. 어떤 인덱스를 순차적으로 수행하는 것만 연결하고 있는지는 신경 쓰지 않습니다.
Tarick Welling

size()-1두 가지 루프 조건에서 왜 사용 하고 있는지 설명 할 수 있습니까 ? 마지막 벡터 요소를 건너 뜁니다. 세 번째 루프는 현재 유일한 루프입니다.
고로

-3

솔직히 말하면 두 벡터의 요소를 다른 벡터로 복사하거나 두 벡터 중 하나만 추가하여 두 벡터를 빠르게 연결할 수 있습니다. 그것은 당신의 목표에 달려 있습니다.

방법 1 : 크기가있는 새 벡터 할당은 두 원본 벡터 크기의 합입니다.

vector<int> concat_vector = vector<int>();
concat_vector.setcapacity(vector_A.size() + vector_B.size());
// Loop for copy elements in two vectors into concat_vector

방법 2 : 벡터 B의 요소를 추가 / 삽입하여 벡터 A를 추가

// Loop for insert elements of vector_B into vector_A with insert() 
function: vector_A.insert(vector_A .end(), vector_B.cbegin(), vector_B.cend());

4
다른 답변에서 아직 제공되지 않은 답변은 무엇입니까?
Mat

13
@ 매트 : 굵은 체 문자.
marcv81

원본 벡터가 더 이상 필요하지 않은 경우 std::move_iterator복사하는 대신 요소를 이동 하도록 사용하는 것이 좋습니다 . ( en.cppreference.com/w/cpp/iterator/move_iterator 참조 )
tmlen

무엇입니까 setcapacity? 무엇입니까 function: ?
LF

@ LF 나는 그 resize방법 에 대해 이야기하고 있다고 생각합니다 .
Matthieu H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.