欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

STL常用技巧.

发布时间:2025/7/25 编程问答 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 STL常用技巧. 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1

比如:vector vecID; 中保存了m个ID,这时要删除第n个ID。

遍历是一个方法;即vector::itertor it = vecID.begin(); 然后++it n次。

更好的方法是:vector::itertor it = vecID.begin() + n; vector的迭代器直接支持这种偏移。

然后用vecID.erase(it)方法 删除该元素。

 

2.去除一个容器中有特定值的所有对象

1)如果容器是vectorstringdeque,使用erase-remove惯用法,例如

c.erase(remove(c.begin(), c.end(), 1963),c.end());

 

2)如果容器是list,使用list.remove

// clist时,remove成员函数是去除特定值的元素的最佳方法

c.remove(1963);

 

3)如果容器是标准关联容器,使用它的erase成员函数,例如:

// c是标准关联容器时,erase成员函数是去除特定值的元素的最佳方法

c.erase(1963);

 

3.去除一个容器中满足一个特定判定式所有对象

 bool badValue(int x);   // 函数定义:返回x是否是“bad

o     如果容器是vectorstringdeque,使用erase-remove_if惯用法:

// cvectorstringdeque时这是去掉badValue返回真的对象的最佳方法

c.erase(remove_if(c.begin(), c.end(), badValue),c.end());

o     如果容器是list,使用list.remove_if

// clist时这是去掉badValue返回真的对象的最佳方法

c.remove_if(badValue);

o     如果容器是标准关联容器,使用remove_copy_ifswap

o     如果需要写一个循环遍历容器元素erase,注意iterator的递增逻辑

// 错误代码:当容器的一个元素被删时,指向那个元素的所有迭代器都失效了

AssocContainer<int> c;

// 不要这么做!

for (AssocContainer<int>::iterator i = c.begin(); i!= c.end(); ++i)

{                                          

    if (badValue(*i))

    {

        c.erase(i);

    }

}

 

// 正确代码:

AssocContainer<int> c;

// for循环的第三部分是空的,i在后面自增。

for (AssocContainer<int>::iterator i = c.begin(); i != c.end();)

{

    if (badValue(*i))

    {

        i = c.erase(i); //仅适用序列容器,关联容器用c.erase(i++); 因关联容器erase 返回void,

    }

    else

    {

        ++i;

    }

}(#add 妙哉)

 

转载于:https://www.cnblogs.com/weiqubo/archive/2011/05/31/2064955.html

总结

以上是生活随笔为你收集整理的STL常用技巧.的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。