📜  从 C++ 中删除元素(1)

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

从 C++ 中删除元素

在 C++ 中,我们可以使用一系列 STL 容器来动态地存储元素,但是在这些容器中删除元素时,我们需要注意一些问题。

vector

如果我们想在 vector 容器中删除一个元素,可以使用 erase() 方法。

std::vector<int> v = {1, 2, 3, 4, 5};
v.erase(v.begin() + 2); // 删除第三个元素(值为3)

这样操作后,vector 中的元素已经发生了改变,第三个元素已经被删除,后面的元素会向前移动填补空位。需要注意的是,erase() 方法的时间复杂度是线性的(O(n)),因为它需要将被删除元素后面的所有元素都向前移动。如果需要删除多个元素,就需要多次调用 erase() 方法,时间复杂度将大大增加。

list

list 容器相对于 vector 容器来说,在插入和删除元素时具有更好的性能。在 list 容器中删除一个元素只需要使用 std::list::erase() 方法即可。

std::list<int> li = {1, 2, 3, 4, 5};
auto it = std::find(li.begin(), li.end(), 3); // 查找要删除的元素
li.erase(it); // 删除查找到的元素

这样操作后,list 中的元素已经发生了改变,第三个元素已经被删除。需要注意的是,list 中删除元素的时间复杂度是常数级别的(O(1)),但是在访问 list 中的元素时,我们需要使用迭代器来指定位置。而且删除元素后,其它元素的位置不会改变。

set 和 multiset

setmultiset 容器中删除元素需要使用 std::set::erase() 方法。由于 setmultiset 中元素是按照一定的规则进行排序的,因此在删除操作后需要保证容器的有序性。

std::set<int> s = {1, 2, 3, 4, 5};
s.erase(3); // 删除值为3的元素

这样操作后,set 中的元素已经发生了改变,值为3的元素已经被删除。需要注意的是,set 中删除元素的时间复杂度也是常数级别的,但是删除元素时需要保证容器的有序性。

map 和 multimap

mapmultimap 容器中删除元素同样需要使用 std::map::erase() 方法。由于 mapmultimap 中元素是按照一定的规则进行排序的,因此在删除操作后需要保证容器的有序性。

std::map<std::string, int> mp = {{"Alice", 10}, {"Bob", 20}, {"Charlie", 30}};
mp.erase("Bob"); // 删除键为"Bob"的元素

这样操作后,map 中的元素已经发生了改变,键为"Bob"的元素已经被删除。需要注意的是,map 中删除元素的时间复杂度也是常数级别的,但是删除元素时需要保证容器的有序性。

以上就是在 C++ 中删除元素的一些方法和注意事项。在实际编程中需要根据具体的情况选择适合的容器并合理使用。