📜  向量的 std::remove 和 vector::erase 之间的区别(1)

📅  最后修改于: 2023-12-03 15:22:58.820000             🧑  作者: Mango

向量的 std::remove 和 vector::erase 之间的区别

在使用C++中的向量时,我们经常需要清除其中的一个或多个元素。这时我们需要使用std::remove或vector::erase函数,但它们之间有一些区别。

std::remove

std::remove 是一个算法,用于从给定范围中移除某个值。它并不会真正删除元素,而是将要删除的元素移动到向量的末尾,并返回一个指向新范围的迭代器。这种方式提高了性能,因为不需要移动其它元素来填补被删除的元素,但也意味着向量的大小并不会改变。

std::vector<int> vec {1, 2, 3, 4, 5, 6, 7, 8};
auto it = std::remove(vec.begin(), vec.end(), 4);
vec.erase(it, vec.end());
// vec: {1, 2, 3, 5, 6, 7, 8}
vector::erase

vector::erase是一个向量的成员函数,用于从向量中删除一个或多个元素,并将其大小缩小。它需要一个迭代器,指向要删除的元素。如果需要删除多个元素,则可以使用两个迭代器,指向要删除的范围。

std::vector<int> vec {1, 2, 3, 4, 5, 6, 7, 8};
vec.erase(std::remove(vec.begin(), vec.end(), 4), vec.end());
// vec: {1, 2, 3, 5, 6, 7, 8}

需要注意的是,使用vector::erase删除元素时,被删除元素之后的所有元素都会向前移动一个位置。这可能会影响性能,尤其在向量较大时。

总结

在删除向量中的元素时,std::remove和vector::erase的选择取决于具体情况。如果需要高效地移除特定的元素,而不想改变向量的大小,则可以使用std::remove。如果需要从向量中删除一个或多个元素,并将其大小缩小,则应使用vector::erase。