stl常用技巧

  1. 删除第n个元素

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

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

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

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

  1. 去除一个容器中有特定值的所有对象
  • 如果容器是vector、string或deque,使用erase-remove惯用法,例如

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

  • 如果容器是list,使用list.remove

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

    c.remove(1963);

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

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

    c.erase(1963);

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

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

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

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

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

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

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

    c.remove_if(badValue);

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

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

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

    AssocContainer 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;
    }
}
  1. 压缩多余的vector空间。
   std::vector<int> vec(5);  //capacity=5

   vec.reserve(100);         //capacity=100

   vec.reserve(10);          //capacity=100

   std::vector<int> temp(vec);  //temp的capacity=5  (拷贝构造函数的功能)  

   temp.swap(vec);              //temp的capacity=100,vec的capacity回复为5 (swap的功能)  

   temp.clear();   //temp功成身退

   std::vector<int>  (vec).swap(vec); 
坚持原创技术分享,您的支持将鼓励我继续创作!