C++ vector、map中刪除符合條件的元素

1. vector中常用的插入和刪除操作

insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count個元素ele. 

push_back(ele); //尾部插入元素ele
pop_back();//刪除最後一個元素


erase(const_iterator start, const_iterator end);//刪除迭代器從start到end之間的元素

erase(const_iterator pos);//刪除迭代器指向的元素

clear();//刪除容器中所有元素

2. 想要刪除vector中符合條件的元素,使用erase:

在c++中,erase重載了2個函數,分別是:刪除迭代器指向的元素和刪除迭代器區間中的所有元素。

  • (1)刪除vector中指定元素。(注意:重載的這兩erase函數的返回值都是指向下一個元素的迭代器)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<numeric>

using namespace std;

void PrintData(vector<int>& vec)
{
	for(auto val:vec)
	{
		cout<<val<<" ";
	}
	cout<<endl;
	return;
}

void DeleteElem()
{
	int arr[] = {1,2,3,5,4,5,6,5,5,7,8,5};
	int len = sizeof(arr)/sizeof(int);
	vector<int> vec(arr,arr+len);
	PrintData(vec);

	cout<<"刪除vec中所有值爲5的元素."<<endl;
	vector<int>::iterator it = vec.begin();
	for(;it != vec.end();)
	{
		if(*it == 5)
			//刪除指定元素,返回指向刪除元素的下一個元素的位置的迭代器
			it = vec.erase(it);
		else
			//迭代器指向下一個元素位置
			++it;
	}
	
	PrintData(vec);
}
int main()
{
	DeleteElem();
	system("pause");
	return 0;
}


輸出結果:
1 2 3 5 4 5 6 5 5 7 8 5
刪除vec中所有值爲5的元素.
1 2 3 4 6 7 8
請按任意鍵繼續. . .


  • (2)刪除std::map中嵌套std::map的指定key。如下代碼,刪除std::map<std::string,std::map<std::string,int>>key“444”的值value
/**@fn            traverseMap
 * @brief         遍歷map容器元素
 * @param[in]     m 容器元素
 * @param[out]    VOID
 * @return        VOID
**/
void traverseMap(std::map<std::string,std::map<std::string,int>> &m, bool bDelete = false)
{
    assert(m.size());
    auto it = m.begin();
    while(it != m.end())
    {
        if(bDelete&&!strncmp("444",it->first.c_str(),strlen("444")))
        {
            m.erase(it++);
        }
        else
        {
            std::cout<<it->first<<" ";
            map<std::string,int>::const_iterator it1 = it->second.begin();
            while(it1 != it->second.end())
            {
                std::cout<<it1->first<<" "<<it1->second<<std::endl;

                ++it1;
            }
            ++it;
        }
    }
}


/**@fn            Test
 * @brief         初始化map容器
 * @param[in]     VOID
 * @param[out]    VOID
 * @return        VOID
**/
void Test()
{
    map<std::string,map<std::string,int>> m;

    //方法1
    m["000"]["aaa"] = 66;

    std::map<std::string,int> v1;
    v1.insert(map<std::string,int>::value_type("bbb",77));
    //方法2
    m.insert(map<std::string,std::map<std::string,int>>::value_type("111",v1));

    std::map<std::string,int> v2;
    v2.insert(pair<std::string,int>("ccc",88));
    //方法3
    m.insert(pair<std::string,std::map<std::string,int>>("222",v2));

    std::map<std::string,int> v3;
    v3.insert(make_pair<std::string,int>("ddd",99));
    //方法4

    //error: no matching function for call to 'make_pair(const char [4], std::map<std::__cxx11::basic_string<char>, int>&)'
    //m.insert(make_pair<std::string,std::map<std::string,int>>("333",v3));                                                                   ^
    //m.insert(make_pair<std::string,std::map<std::string,int>>("333",v3));

    //方法5
    std::map<std::string,int> v4;
    v4["eee"] = 100;
    m["444"] = v4;

    traverseMap(m);
    std::cout<<"==================================================="<<std::endl;
    //現在刪除map中key爲"444"的值value
    traverseMap(m,true);
    std::cout<<"==================================================="<<std::endl;
}

結果如下:
在這裏插入圖片描述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章