C ++ 벡터의 삽입 및 푸시 백 차이
vector
의 push_back
와 insert
기능 의 차이점을 알고 싶습니다 .
구조적 차이가 있습니까?
정말 큰 성능 차이가 있습니까?
가장 큰 차이점은 기능입니다. push_back
항상 말에 새로운 요소를 박았 vector
과 insert
새로운 요소의 위치를 선택할 수 있습니다. 이것은 성능에 영향을 미칩니다. 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_back
와 v.insert(v.end(), value)
.
사실, (약간 더 나은 성능으로) push_back(x)
동일한 insert(x, end())
기능을 수행하지만 이러한 기능에 대해 알아야 할 몇 가지 중요한 사항이 있습니다.
push_back
BackInsertionSequence
컨테이너 에만 존재 하므로 예를 들어에는 존재하지 않습니다set
.push_back()
항상 마지막에 추가 할 것을 허용 하기 때문에 불가능 합니다.- 일부 컨테이너도 만족할
FrontInsertionSequence
수 있으며push_front
. 에 의해 만족deque
되지만에 의해 만족 되지 않습니다vector
. - 은
insert(x, ITERATOR)
출신InsertionSequence
에 공통적 인set
및vector
. 이 방법으로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
'IT박스' 카테고리의 다른 글
git diff를 사용하여 줄 번호를 추가하고 수정하려면 어떻게해야합니까? (0) | 2020.10.27 |
---|---|
MySQL Workbench Edit Table Data는 읽기 전용입니다. (0) | 2020.10.27 |
사용자 지정 속성에 대한 클라이언트 측 유효성 검사 수행 (0) | 2020.10.26 |
getExternalFilesDir과 getExternalStorageDirectory ()의 차이점 (0) | 2020.10.26 |
MySQL 업데이트 CASE WHEN / THEN / ELSE (0) | 2020.10.26 |