인덱스로 std :: vector <>에서 요소를 지우려면 어떻게합니까? vector <int>가 있고 n

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방법은 두 가지 방식으로 사용됩니다.

  1. 단일 요소 지우기 :

    vector.erase( vector.begin() + 3 ); // Deleting the fourth element
  2. 요소 지우기 범위 :

    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)