现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

STL常用技巧

2012-09-12 19:31 工业·编程 ⁄ 共 1222字 ⁄ 字号 暂无评论

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)如果容器是vector、string或deque,使用erase-remove惯用法,例如

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

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

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

c.remove(1963);

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

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

c.erase(1963);

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

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

o 如果容器是vector、string或deque,使用erase-remove_if惯用法:

// 当c是vector、string或deque时这是去掉badValue返回真的对象的最佳方法

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

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

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

c.remove_if(badValue);

o 如果容器是标准关联容器,使用remove_copy_if和swap。

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 妙哉)

给我留言

留言无头像?