std :: vector <int>가 있고 n 번째 요소를 삭제하고 싶습니다. 어떻게합니까?
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(???);
답변
단일 요소를 삭제하려면 다음을 수행하십시오.
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
// Deletes the second element (vec[1])
vec.erase(vec.begin() + 1);
또는 한 번에 둘 이상의 요소를 삭제하려면 다음을 수행하십시오.
// Deletes the second through third elements (vec[1], vec[2])
vec.erase(vec.begin() + 1, vec.begin() + 3);
답변
std :: vector의 지우기 메소드가 과부하되어 있으므로 호출하는 것이 더 명확합니다.
vec.erase(vec.begin() + index);
단일 요소 만 지우고 싶을 때
답변
template <typename T>
void remove(std::vector<T>& vec, size_t pos)
{
std::vector<T>::iterator it = vec.begin();
std::advance(it, pos);
vec.erase(it);
}
답변
이 erase
방법은 두 가지 방식으로 사용됩니다.
-
단일 요소 지우기 :
vector.erase( vector.begin() + 3 ); // Deleting the fourth element
-
요소 지우기 범위 :
vector.erase( vector.begin() + 3, vector.begin() + 5 ); // Deleting from fourth element to sixth element
답변
실제로이 erase
기능은 두 가지 프로파일에서 작동합니다.
-
단일 요소 제거
iterator erase (iterator position);
-
다양한 요소 제거
iterator erase (iterator first, iterator last);
std :: vec.begin ()은 컨테이너의 시작을 표시하고 벡터에서 ith 요소를 삭제하려면 다음을 사용할 수 있습니다.
vec.erase(vec.begin() + index);
자세히 살펴보면 vec.begin ()은 벡터의 시작 위치에 대한 포인터 일 뿐이며 i 값을 추가하면 i 위치에 대한 포인터가 증가하므로 대신 i 번째 요소에 대한 포인터에 액세스 할 수 있습니다.
&vec[i]
그래서 우리는 쓸 수 있습니다 :
vec.erase(&vec[i]); // To delete the ith element
답변
정렬되지 않은 벡터가있는 경우 정렬되지 않은 벡터를 활용하여 CPPCON의 Dan Higgins에서 본 것을 사용할 수 있습니다.
template< typename TContainer >
static bool EraseFromUnorderedByIndex( TContainer& inContainer, size_t inIndex )
{
if ( inIndex < inContainer.size() )
{
if ( inIndex != inContainer.size() - 1 )
inContainer[inIndex] = inContainer.back();
inContainer.pop_back();
return true;
}
return false;
}
목록 순서는 중요하지 않으므로 목록의 마지막 요소를 가져 와서 제거하려는 항목의 맨 위에 복사 한 다음 마지막 항목을 팝업하여 삭제하십시오.
답변
큰 벡터 (크기> 100,000)로 작업하고 많은 요소를 삭제하려면 다음과 같이하십시오.
int main(int argc, char** argv) {
vector <int> vec;
vector <int> vec2;
for (int i = 0; i < 20000000; i++){
vec.push_back(i);}
for (int i = 0; i < vec.size(); i++)
{
if(vec.at(i) %3 != 0)
vec2.push_back(i);
}
vec = vec2;
cout << vec.size() << endl;
}
이 코드는 vec의 모든 숫자를 3으로 나눌 수 없으며 vec2에 복사합니다. 그런 다음 vec2를 vec로 복사합니다. 꽤 빠릅니다. 20,000,000 개의 요소를 처리하는 데이 알고리즘은 0.8 초만 걸립니다!
나는 지우기 방법으로 똑같은 일을했으며 많은 시간이 걸립니다.
Erase-Version (10k elements) : 0.04 sec
Erase-Version (100k elements) : 0.6 sec
Erase-Version (1000k elements): 56 sec
Erase-Version (10000k elements): ...still calculating (>30 min)