IT박스

C ++ 벡터의 삽입 및 푸시 백 차이

itboxs 2020. 10. 27. 07:56
반응형

C ++ 벡터의 삽입 및 푸시 백 차이


vectorpush_backinsert기능 차이점을 알고 싶습니다 .

구조적 차이가 있습니까?

정말 큰 성능 차이가 있습니까?


가장 큰 차이점은 기능입니다. push_back항상 말에 새로운 요소를 박았 vectorinsert새로운 요소의 위치를 선택할 수 있습니다. 이것은 성능에 영향을 미칩니다. vector너무 적은 메모리가 할당되어 길이를 늘릴 필요가있을 때만 요소가 메모리에서 이동됩니다. 반면 insert에 새 요소의 선택된 위치 이후 모든 요소를 ​​강제로 이동합니다. 당신은 단지 그것을위한 장소를 만들어야합니다. 이것이 insert종종 push_back.


기능의 목적은 다릅니다. vector::insert의 지정된 위치에 개체를 삽입 할 수있는 vector반면 vector::push_back개체를 끝에 붙입니다. 다음 예를 참조하십시오.

using namespace std;
vector<int> v = {1, 3, 4};
v.insert(next(begin(v)), 2);
v.push_back(5);
// v now contains {1, 2, 3, 4, 5}

당신이 사용할 수있는 insert것과 동일한 작업을 수행 할 수 push_backv.insert(v.end(), value).


사실, (약간 더 나은 성능으로) push_back(x)동일한 insert(x, end())기능을 수행하지만 이러한 기능에 대해 알아야 할 몇 가지 중요한 사항이 있습니다.

  1. push_backBackInsertionSequence컨테이너 에만 존재 하므로 예를 들어에는 존재하지 않습니다 set. push_back()항상 마지막에 추가 할 것을 허용 하기 때문에 불가능 합니다.
  2. 일부 컨테이너도 만족할 FrontInsertionSequence수 있으며 push_front. 에 의해 만족 deque되지만에 의해 만족 되지 않습니다 vector.
  3. insert(x, ITERATOR)출신 InsertionSequence에 공통적 인 setvector. 이 방법으로 set또는 vector여러 삽입을위한 대상으로 사용할 수 있습니다 . 그러나 set추가적으로 insert(x), 이는 실질적으로 동일한 작업을 수행합니다 (이 첫 번째 삽입은 set다른 반복기 (이 경우에는 사용되지 않는 기능)에서 시작하여 적절한 위치를 검색하는 속도를 높이는 것을 의미합니다).

당신은 루프에서 요소를 추가하려는 경우, 다음 일을하는 마지막 경우에 대한 메모 container.push_back(x)하고 container.insert(x, container.end())효과적으로 같은 일을 할 것입니다. 그러나 이것을 container.end()먼저 얻은 다음 전체 루프에서 사용 하면 이것은 사실이 아닙니다 .

예를 들어 다음 코드 위험 할 수 있습니다 .

auto pe = v.end();
for (auto& s: a)
    v.insert(pe, v);

이렇게하면 전체 a역순 으로 v벡터에 효과적으로 복사 할 수 있으며, 확장을 위해 벡터를 재할 당하지 못할만큼 운이 좋은 경우에만 ( 먼저 호출하여이를 방지 할 수 있습니다 .) 운이 좋지 않으면 소위 UndefinedBehavior (tm)를 얻게됩니다. 이론적으로는 벡터의 반복자가 새 요소가 추가 될 때마다 무효화되는 것으로 간주되기 때문에 허용되지 않습니다.reserve()

이렇게하면 :

copy(a.begin(), a.end(), back_inserter(v);

원래 순서 a의 끝에 복사 되며 v반복자 무효화의 위험이 없습니다.

[편집] 이전에이 코드를 이런 식으로 만들었는데 inserter실제로 반복자의 유효성과 발전을 유지 하기 때문에 실수였습니다 .

copy(a.begin(), a.end(), inserter(v, v.end());

따라서이 코드는 위험없이 원래 순서대로 모든 요소를 ​​추가합니다.

참고 URL : https://stackoverflow.com/questions/13324431/c-vectors-insert-push-back-difference

반응형