나는 여러 가지 방법을 제공하고 (오프셋 (offset)와 지우기 선형 다음 옵션을하지 않는 정렬)
지울 요소에 벡터의 현재 마지막 요소를 할당 한 다음 마지막 요소를 지 웁니다. 이렇게하면 큰 움직임을 피할 수 있고 마지막 색인을 제외한 모든 색인은 일정하게 유지됩니다. 뒤에서 지우기를 시작하면 사전 계산 된 모든 색인이 정확합니다. I이 표시
void quickDelete(int idx)
{
vec[idx] = vec.back();
vec.pop_back();
}
본질적 ... 소거 제거 관용구의 자필 버전 Klaim으로 지적되고
2 요소의 원래 순서를 유지하는 느린 방법
1 단계 : 삭제할 벡터 요소를 모두 표시합니다 (예 : 특수 값 사용). O (삭제할 색인 |)이 있습니다.
2 단계 : v.erase(remove (v.begin(), v.end(), special_value), v.end());
을 사용하여 표시된 모든 요소를 지 웁니다. 이것은 O (| v |)를 가진다.
따라서 인덱스 목록이 벡터보다 짧은 경우 총 실행 시간은 O (| vector v |)입니다.
3 요소의 원래 순서 보유 느린 다른 방법
사용 술어 및 https://stackoverflow.com/a/3487742/280314에 기재된 경우 삭제한다. 이것을 효율화하고 의 요구 사항을 존중하려면 "정렬로 선형 적으로 지우기"를 선택하지 말아야합니다. 제 생각은 해시 테이블을 사용하여 술어를 구현하고 해시 테이블에 저장된 색인을 조정하여 삭제가 true를 반환 할 때 진행되도록하는 것입니다. Klaim은 제안했다.
http://www.cplusplus.com/reference/algorithm/remove_if/이 (remove-erase idiom 참조) 항목을 삭제하는 것을 잊지 마세요 참조 : 술어 당신은 당신이 원하는 것을 달성 할 수 remove_if 알고리즘을 사용하여
"오프셋을 사용한 선형 소거는 선택 사항이 아닙니다."이유는 무엇입니까? – Niki