C++ STL set:erase()、clear()、find()、insert()方法

本文介绍了C++标准库中的set容器中erase()方法的三种用法,包括删除单个元素和范围内的元素,以及返回值的意义。同时,文章讨论了clear()方法用于清空set容器,以及find()方法在查找元素时的行为,特别是找不到元素时返回的迭代器指向的位置。最后提到了insert()方法用于向set中插入元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、erase() 方法

        如图所示:

#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
    //创建并初始化 set 容器
    set<int>myset{1,2,3,4,5};
    cout << "myset size = " << myset.size() << endl;

    //1) 调用第一种格式的 erase() 方法, 其返回值为一个整数,表示成功删除的元素个数
    int num = myset.erase(2); //删除元素 2,myset={1,3,4,5}
    cout << "1、myset size = " << myset.size() << endl;
    cout << "num = " << num << endl;

    //2) 调用第二种格式的 erase() 方法, 返回值是迭代器,其指向的是 set 容器中删除元素之后的第一个元素
    set<int>::iterator iter = myset.erase(myset.begin()); //删除元素 1,myset={3,4,5}
    cout << "2、myset size = " << myset.size() << endl;
    cout << "iter->" << *iter << endl;

    //3) 调用第三种格式的 erase() 方法, 返回值是迭代器,其指向的是 set 容器中删除元素之后的第一个元素
    set<int>::iterator iter2 = myset.erase(myset.begin(), --myset.end());//删除元素 3,4,myset={5}
    cout << "3、myset size = " << myset.size() << endl;
    cout << "iter2->" << *iter2 << endl;
    return 0;
}

        执行结果为:

二、clear()方法

        该方法不需要传入任何参数,也没有任何返回值。

#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
    //创建并初始化 set 容器
    std::set<int>myset{1,2,3,4,5};
    cout << "1、myset size = " << myset.size() << endl;
    //清空 myset 容器
    myset.clear();
    cout << "2、myset size = " << myset.size() << endl;
    return 0;
}

        执行结果为:

三、find()方法

参数:该函数接受一个强制性参数element ,该元素指定要在集合容器中搜索的元素。

返回值:该函数返回一个迭代器,该迭代器指向在集合容器中搜索的元素。如果找不到该元素,则迭代器将指向集合中最后一个元素之后的位置。

// CPP program to demonstrate the
// set::find() function
#include <bits/stdc++.h>
using namespace std;
int main()
{

    // Initialize set
    set<int> s;

    s.insert(1);
    s.insert(4);
    s.insert(2);
    s.insert(5);
    s.insert(3);
    for (auto j = s.begin(); j != s.end(); j++) {
        cout << *j<<"\t";
    }
    cout<<endl;
    auto pos = s.find(3);
    // prints the set elements
    cout << "The set elements after 3 are: ";
    for (auto it = pos; it != s.end(); it++)
        cout << *it << " ";

    return 0;
}

         这些都是查找成功的情况,返回对应元素位置的迭代器,那如果找不到呢?经过验证得出:找不到返回it.end(),也即集合中最后一个元素之后的位置。但我试了发现一个很奇怪的事:找不到时返回的迭代器对应的元素居然不是0,而是5(集合中最后一个元素)!如图所示:

#include <bits/stdc++.h>
using namespace std;
int main()
{

    // Initialize set
    set<int> s;

    s.insert(1);
    s.insert(4);
    s.insert(2);
    s.insert(5);
    s.insert(3);
    for (auto j = s.begin(); j != s.end(); j++) {
        cout << *j<<"\t";
    }
    cout<<endl;

    cout<<"找不存在的0:";
    auto pos = s.find(0);
    cout<<*pos<<"\t";
    cout<<(pos==s.end())<<endl;

    cout<<"找存在的5:";
    auto pos2 = s.find(5);
    cout<<*pos2<<"\t";
    cout<<(pos2==s.end())<<endl;

    cout<<"找不存在的6:";
    auto pos3 = s.find(6);
    cout<<*pos3<<"\t";
    cout<<(pos3==s.end())<<endl;

    cout<<"找不存在的7:";
    auto pos4 = s.find(7);
    cout<<*pos4<<"\t";
    cout<<(pos4==s.end())<<endl;

    cout<<"*s.begin():"<<*s.begin()<<endl;
    cout<<"*s.end():"<<*s.end()<<endl;
    return 0;
}

        可见s.end()虽然指向不存在的位置,但这个位置的数据并不是0,而是非空集合当中的最后一个元素!

        所以判断是否成功找到的条件应该为if(pos!=s.end())而不是if(*pos!=0):

	set<int> test;
	if(test.find(x)!=test.end());	//之前忘记加()
	{
	···
	}

四、insert()方法

#include <bits/stdc++.h> 
using namespace std; 
int main() 
{ 
  
    set<int> s; 
  
    // Function to insert elements 
    // in the set container 
    s.insert(1); 
    s.insert(4); 
    s.insert(2); 
    s.insert(5); 
    s.insert(3); 
  
    cout << "The elements in set are: "; 
    for (auto it = s.begin(); it != s.end(); it++) 
        cout << *it << " "; 
  
    return 0; 
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值