C++ SetInsert函数:用法、特性及示例

发布时间:2023-05-17

SetInsert函数是C++ STL库中set容器类中的成员函数之一,用于向set容器中插入元素。其函数原型如下所示:

std::pair<iterator, bool> insert(const value_type& val)

该函数返回一个std::pair对象,第一个元素是一个迭代器,它指向被插入元素的位置,第二个元素是一个bool类型,它指示元素是否被成功插入。

一、函数的使用方法

在使用set容器的insert函数时,需要传递一个value_type类型的参数。value_type是set容器中存储元素的类型,和set类型定义中所指定的类型相同。对于一个int类型的set,value_type则为int。 如果元素已经存在于set中,则insert操作无法插入该元素,并返回当前元素的迭代器以及bool类型的false值;否则,insert操作会将该元素插入到set中,并返回插入元素的迭代器以及bool类型的true值。下面是一个插入元素的示例:

//创建set对象
std::set<int> s;
//插入元素
s.insert(10);
s.insert(30);
s.insert(20);

二、函数的特性

1. 自动去重

set容器自动对插入的元素进行去重,即set容器中不会存在相同的元素。如果你插入一个已经存在于set中的元素,那么这个元素不会被插入到set中。下面的示例展示了使用insert函数进行去重的操作:

std::set<int> myset;
std::set<int>::iterator it;
myset.insert(10);
myset.insert(20);
myset.insert(30);
it = myset.insert(20);
if (it.second == false)
    cout << "element already exists" << endl;

2. 元素插入位置

set容器中的元素是按照一定的顺序进行存储的。元素插入时不是按照插入的顺序来存储,而是按照set容器类型定义中指定的元素类型进行排序存储的,这样会降低插入元素的复杂度。所以,如果元素插入顺序是随机的,则插入元素的顺序和最终的set的顺序不一定相同。下面是一个插入元素的示例:

std::set<int> myset;
std::set<int>::iterator it;
std::pair<std::set<int>::iterator, bool> ret;
//插入元素
ret = myset.insert(30);
it = ret.first;
printf("*it is : %d\n", *it);
ret = myset.insert(20);
it = ret.first;
printf("*it is : %d\n", *it);
ret = myset.insert(10);
it = ret.first;
printf("*it is : %d\n", *it);

三、函数的示例

1. 插入一个元素

下面是一个实例,展示如何使用insert插入一个元素:

std::set<int> myset;
std::set<int>::iterator it;
//插入元素
it = myset.insert(10);
//输出myset
for (it=myset.begin(); it!=myset.end(); ++it)
    std::cout << ' ' << *it;
std::cout << std::endl;

2. 插入多个元素

下面是一个实例,展示如何使用insert插入多个元素:

std::set<int> myset;
std::set<int>::iterator it;
int arr[] = {10, 20, 30, 40, 50};
myset.insert(arr, arr+5);
//输出myset
for (it=myset.begin(); it!=myset.end(); ++it)
    std::cout << ' ' << *it;
std::cout << std::endl;

3. 插入容器中不存在的元素

下面是一个实例,展示如何使用insert插入容器中不存在的元素:

std::set<int> myset;
std::set<int>::iterator it;
std::pair<std::set<int>::iterator,bool> ret;
//插入元素
ret = myset.insert(10);
if (ret.second == false) {
    it = ret.first;
    std::cout << "element already exists" << std::endl;
}
//输出myset
for (it = myset.begin(); it != myset.end(); ++it)
    std::cout << ' ' << *it;
std::cout << std::endl;

4. 插入容器中已经存在的元素

下面是一个实例,展示如何使用insert插入容器中已经存在的元素:

std::set<int> myset;
std::set<int>::iterator it;
std::pair<std::set<int>::iterator,bool> ret;
//插入元素
ret = myset.insert(10);
if (ret.second == false) {
    it = ret.first;
    std::cout << "element already exists" << std::endl;
}
//再次插入相同的元素
ret = myset.insert(10);
if (ret.second == false) {
    it = ret.first;
    std::cout << "element already exists" << std::endl;
}
//输出myset
for (it = myset.begin(); it != myset.end(); ++it)
    std::cout << ' ' << *it;
std::cout << std::endl;

5. 插入结构体类型元素

set容器可以存储自定义的结构体类型。下面是一个示例,展示如何使用insert函数插入结构体类型元素:

#include <set>
#include <iostream>
#include <iomanip>
#include <string>
typedef struct Student
{
    std::string name;
    int age;
    bool operator()(const Student &stu1, const Student &stu2) const
    {
        return stu1.name < stu2.name;
    }
} Student; //定义operator()用于自定义排序
int main()
{
    std::set<Student, Student> student_list;
    std::set<Student, Student>::iterator it;
    Student s1, s2, s3;
    s1.name = "Tom";
    s1.age = 20;
    s2.name = "Jerry";
    s2.age = 22;
    s3.name = "Lisa";
    s3.age = 19;
    student_list.insert(s1);
    student_list.insert(s2);
    student_list.insert(s3);
    for (it=student_list.begin(); it!=student_list.end(); ++it)
        std::cout << std::setw(10) << it->name << std::setw(10) << it->age << std::endl;
    return 0;
}

以上就是C++ STL库set容器中insert函数的用法、特性及示例。需要注意的是,set容器是按照元素类型进行默认的排序,如果需要按照特定的排序规则来存储元素,则可以通过自定义函数对象的方式来实现排序。