繁体   English   中英

擦除 std::vector 的 function

[英]Erase function of the std::vector

我有一个std::vector和一个指向向量中元素的迭代器。 我的问题是如何从向量中删除一个元素并保留迭代器?

我尝试使用第二个迭代器来查找我想要删除的特定元素,并在使用擦除 function 擦除它后,第一个迭代器变得无效。

我的问题是如何从向量中删除一个元素并保留迭代器?

您不能使用std::vector::iterator 迭代器将通过擦除元素而失效。

但是您可以通过编写自己的迭代器 class 来实现这一点,该迭代器存储指向向量和索引的指针。

std::vector::erase将使擦除元素处或之后的所有迭代器无效:

在擦除点处或之后使迭代器和引用无效,包括 end() 迭代器。

但是, erase将返回一个迭代器,该迭代器指向最后一个被删除元素之后的元素。 也许这足以满足您的用例?

我有一个 std::vector 和一个指向向量中元素的迭代器。 我的问题是如何从向量中删除一个元素并保留迭代器?

请注意,当一个元素被删除时,没有迭代器可以指向它,因为它不再存在。 因此,要引用它的位置,通常的做法是使用从erase()方法返回的迭代器。 这允许使用insert()方法,该方法将在先前擦除的 object 的 position 中放入一个值。 使用一个迭代器,只需使用这个:

auto loc_after = v.erase(iter);  // since the element has been erased loc_after points to the position the erased element had

我尝试使用第二个迭代器来查找我想要删除的特定元素,并在使用擦除 function 擦除它之后,第一个迭代器变得无效。

在两个迭代器的情况下,可以通过首先擦除物理上最后一个迭代器来轻松擦除元素,因为较早的迭代器没有失效。 这封装在 function 中。 返回的迭代器指向超过“第一个”迭代器的 position 的一个,无论第一个和第二个迭代器之间的顺序如何。

#include <vector>
#include <iostream>

// This returns an iterator positioned after where  first_iter was before being erased
// this allows the insert(pos, val) method to insert a value in the the location just prior to pos
std::vector<int>::iterator second_iterator_loc(std::vector<int>& v, std::vector<int>::iterator first_iter, std::vector<int>::iterator second_iter)
{
    std::vector<int>::iterator iter;
    if (first_iter < second_iter)
    {
        v.erase(second_iter);
        iter = v.erase(first_iter);
    }
    else if (second_iter < first_iter)
    {
        auto dist = first_iter - second_iter;
        v.erase(first_iter);
        iter = v.erase(second_iter) + dist - 1;
    }
    else
    {
        ;// handler in case both iterators point to the same object
    }
    return iter;
}

int main()
{
    std::vector<int> v{ 1,2,3,4,5 };
    std::vector<int> v2 = v;

    std::vector<int>::iterator iter1 = v.begin() + 1; // points to 2 in v
    std::vector<int>::iterator iter2 = v.begin() + 3; // points to 4 in v

    std::vector<int>::iterator iter;
    iter = second_iterator_loc(v, iter1, iter2);
    v.insert(iter, 9);  // inserts a 9 in the previous location of the "first" iterator (where "2" was)
    for (auto x : v)
        std::cout << x << '\n'; // prints: 1 9 4 5

    v = v2;
    iter1 = v.begin() + 3; // reverse iterator positions
    iter2 = v.begin() + 1;

    iter = second_iterator_loc(v, iter1, iter2);
    v.insert(iter, 9);  // inserts a 9 in the previous location of the "first" iterator (where "4" was)
    for (auto x : v)
        std::cout << x << '\n'; // prints: 1 3 9 5

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM