Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
C++STL容器insert和erase操作技巧_创想鸟

C++STL容器insert和erase操作技巧

选择合适的STL容器是关键,vector适合尾部操作但中间插入删除慢,list任意位置插入删除快但随机访问差,deque头尾操作高效,set和map插入删除复杂度为O(log n)且自动排序;若频繁在中间插入删除应选list或forward_list,仅尾部添加则用vector;vector的insert和erase非尾部操作需移动元素,复杂度O(n),可用erase-remove惯用法优化批量删除;list插入删除O(1),但查找位置开销大,且循环中erase需用返回值更新迭代器以防失效;map和set插入删除O(log n),推荐emplace避免临时对象开销;所有容器都需注意迭代器失效问题,尤其是vector、deque在操作后原有迭代器可能失效,应使用erase返回值或范围for循环降低风险。

c++stl容器insert和erase操作技巧

C++ STL容器的insert和erase操作,用对了能提升效率,用错了可能埋下性能隐患。关键在于理解不同容器的特性以及操作背后的复杂度。

理解并高效使用C++ STL容器的insert和erase操作,核心在于选择合适的容器和操作方式,避免不必要的性能损失。

如何选择合适的STL容器?

选择容器是第一步,直接影响后续insert和erase的效率。

vector

适合尾部操作,中间插入删除代价较高;

list

擅长任意位置插入删除,但随机访问慢;

deque

则在头部和尾部插入删除效率较高。

set

和

map

基于红黑树,插入删除有log(n)的复杂度,且自动排序。所以,先搞清楚你的需求:频繁在中间插入删除?还是主要在头部尾部操作?需要排序吗?

例如,如果你需要频繁在中间插入删除元素,

std::list

或

std::forward_list

可能是更好的选择。如果只需要在尾部添加元素,

std::vector

通常是最快的。

立即学习“C++免费学习笔记(深入)”;

vector

的insert和erase操作为什么慢?

vector

的insert和erase操作,如果不是在尾部,都需要移动元素。想象一下,你在一个已经排好队的队伍中间插入一个人,后面的人是不是都要往后挪一步?

vector

就是这样,插入位置之后的元素都需要移动,erase也是同理。这会导致O(n)的复杂度,n是插入或删除位置之后的元素数量。所以,如果需要频繁在

vector

中间插入删除,最好考虑其他容器。

一个常见的优化技巧是,如果需要在

vector

中删除多个元素,可以考虑使用

erase-remove

惯用法。例如,删除所有值为

x

的元素:

#include #include int main() {    std::vector v = {1, 2, 3, 2, 4, 2, 5};    v.erase(std::remove(v.begin(), v.end(), 2), v.end());    // v 现在是 {1, 3, 4, 5}    return 0;}

这个方法比循环遍历删除效率更高,因为它只需要移动一次元素。

list

的insert和erase操作一定快吗?

list

的insert和erase操作,只需要修改指针,不需要移动元素,所以效率很高,复杂度是O(1)。但是,

list

的随机访问效率很低,需要从头开始遍历,所以如果你需要先找到插入或删除的位置,再进行操作,那么查找的代价可能会很高。

此外,需要注意的是,

list

的insert和erase操作需要迭代器,如果迭代器失效了,会导致未定义行为。例如,在循环中使用erase操作时,需要特别小心:

#include #include int main() {    std::list lst = {1, 2, 3, 4, 5};    for (auto it = lst.begin(); it != lst.end(); ) {        if (*it % 2 == 0) {            it = lst.erase(it); // erase 返回下一个有效的迭代器        } else {            ++it;        }    }    for (int i : lst)        std::cout << i << " ";    std::cout << std::endl;    return 0;}

注意

erase

返回的是下一个有效迭代器,必须用它来更新

it

。

map

和

set

的insert和erase操作有什么需要注意的?

map

和

set

基于红黑树实现,插入和删除操作会自动维护树的平衡,所以复杂度是O(log n)。插入时,如果key已经存在,

map

会更新value,

set

则不会插入。删除时,需要注意迭代器失效的问题,和

list

类似。

另外,

map

和

set

的insert操作可以使用

emplace

方法,它可以避免不必要的拷贝或移动操作,提高效率。例如:

#include #include int main() {    std::map myMap;    myMap.emplace(1, "value1"); // 避免创建临时对象    return 0;}
emplace

直接在容器内部构造对象,避免了先创建对象再拷贝或移动的开销。

如何避免迭代器失效?

迭代器失效是使用STL容器时常见的坑。在insert和erase操作之后,有些迭代器会失效,导致程序崩溃或产生未定义行为。一般来说,

vector

和

deque

的insert和erase操作会导致插入或删除位置之后的迭代器失效,

list

的erase操作只会导致被删除元素的迭代器失效,而

map

和

set

的erase操作也只会导致被删除元素的迭代器失效。

为了避免迭代器失效,可以遵循以下原则:

在循环中使用erase操作时,使用erase返回的迭代器更新迭代器。尽量避免在insert或erase操作之后使用之前保存的迭代器。使用基于范围的for循环(C++11引入)可以避免手动管理迭代器,从而减少迭代器失效的风险。

总的来说,理解不同容器的特性,选择合适的容器,并注意迭代器失效问题,才能高效安全地使用C++ STL容器的insert和erase操作。

以上就是C++STL容器insert和erase操作技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1475495.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++模板与智能指针结合使用技巧
上一篇 2025年12月18日 23:26:17
C++delete释放内存注意事项
下一篇 2025年12月18日 23:26:27

相关推荐

发表回复

登录后才能评论
关注微信