c++ std::vector 删除指定元素的两种形式

#include <iostream>
#include <vector>
#include <algorithm>
#include <memory>

using namespace std;
class Display
{
    public:
    Display(int pid):removeBoo(false)
    {
        id = pid;
    }
    ~Display()
    {

    }
    void showInfo(){
        cout << "dispatch evt id: "<< id << endl;
    }
    //
    bool removeBoo;
    //
    int getId(){
        return id;
    }
    private:
        int id;
};
std::vector<std::shared_ptr<Display>> s_display_vec;
// 不需要保持原有顺序的
void removeEleTest1()
        {
            std::vector <std::shared_ptr<Display>>::iterator iter = s_display_vec.begin();
            for (; iter != s_display_vec.end();)
            {
                if ((*iter)->removeBoo) {
                    std::swap(*iter,s_display_vec.back());
                    s_display_vec.pop_back();
            // c++11这样做没必要
//if(s_display_vec.size() < 1) break;
} else { (*iter)->showInfo(); ++iter; } } } ///* // 需要保持原有顺序的 void removeEleTest2() { std::vector <std::shared_ptr<Display>>::iterator iter = s_display_vec.begin(); for (; iter != s_display_vec.end();) { if ((*iter)->removeBoo) { // 在这里将target的标记,记录为未加入列表 //(*iter) if (iter == s_display_vec.end()) { cout << "--a delete " <<(*iter)->getId()<<"--"<< endl; s_display_vec.pop_back(); break; } else { cout << "--b delete " <<(*iter)->getId()<<"--"<< endl; iter = s_display_vec.erase(iter); } } else { (*iter)->showInfo(); ++iter; } } } //*/ int main() { cout << "Hello world!" << endl; //int j = 0; std::shared_ptr<Display> dp_0 = std::make_shared<Display>(0); std::shared_ptr<Display> dp_1 = std::make_shared<Display>(1); std::shared_ptr<Display> dp_2 = std::make_shared<Display>(2); std::shared_ptr<Display> dp_3 = std::make_shared<Display>(3); std::shared_ptr<Display> dp_4 = std::make_shared<Display>(4); ///* s_display_vec.push_back(dp_0); s_display_vec.push_back(dp_1); s_display_vec.push_back(dp_2); s_display_vec.push_back(dp_3); s_display_vec.push_back(dp_4); cout << "s_display_vec.size: "<< s_display_vec.size() << endl; cout << "------------------" << endl; // 设置哪一个可以被删除 dp_3->removeBoo = true; removeEleTest2(); cout << "----------aaa--------" << endl; removeEleTest2(); cout << "s_display_vec.size: "<< s_display_vec.size() << endl; //*/ return 0; }

 

posted @ 2018-02-10 19:31  vily_雷  阅读(758)  评论(0)    收藏  举报