2024年网安最全面向初学者的 STL set 详解,一看就懂!


输出结果为:



linuxy@linuxy:~/STLset$ g++ -o main main.cpp
linuxy@linuxy:~/STLset$ ./main
1 2 3
linuxy@linuxy:~/STLset$


### 2.3 常用方法



size() : 返回容器元素个数
clear() : 清空容器元素
empty() : 判断容器是否为空,空返回 true,否则,返回false
begin() : 返回指向第一个元素的迭代器
end() : 返回指向最后一个元素的迭代器
rbegin() : 返回指向最后一个元素的反向迭代器
rend() : 返回指向第一个元素的反向迭代器
lower_bound() : 返回指向等于或大于指定键值元素的迭代器
upper_bound() : 返回指向大于指定键值元素的迭代器
erase (position) : 删除迭代器 position 指向的元素
erase (first, last) : 删除 [first, last) 区间的元素
insert(val) : 插入元素 val
find (val) : 查找元素 val,如果存在返回其迭代器


![](https://img-blog.csdnimg.cn/20210910125828563.gif)


##  三、set 方法实例演示


### 3.1 size()、clear()、empty() 方法


函数原型如下所示:



size_type size() const noexcept; // 返回容器元素个数
void clear() noexcept; // 清空容器
bool empty() const noexcept; // 判断容器是否为空,空返回 true,否则,返回false


下面来看一个例子:



#include
#include // set 容器头文件
using namespace std; // 没有这句,则需要使用 std::set

int main() {
sett1; //定义 set 对象 t1

cout<<"t1.empty() = "<<t1.empty()<<endl; // 1
cout<<"t1.size() = "<<t1.size()<<endl;   // 0

for(int i = 1; i <= 6; ++i) {    // 插入 1 2 3 4 5 6
    t1.insert(i);
}
cout<<"-------------------------------"<<endl; // 分割线
cout<<"t1.empty() = "<<t1.empty()<<endl;       // 0
cout<<"t1.size() = "<<t1.size()<<endl;         // 6

cout<<"-------------------------------"<<endl;
t1.clear();             // 清空元素
cout<<"t1.empty() = "<<t1.empty()<<endl;  // 1
cout<<"t1.size() = "<<t1.size()<<endl;    // 0
return 0;

}


输出结果为:



linuxy@linuxy:~/STLset$ g++ -o main main.cpp
linuxy@linuxy:~/STLset$ ./main
t1.empty() = 1
t1.size() = 0

t1.empty() = 0
t1.size() = 6

t1.empty() = 1
t1.size() = 0
linuxy@linuxy:~/STLset$


### 3.2 begin()、end() 方法


函数原型如下所示:



iterator begin() noexcept; // 返回指向第一个元素的迭代器
iterator end() noexcept; // 返回指向最后一个元素的迭代器


下面来看一个例子:



#include
#include // set 容器头文件
using namespace std; // 没有这句,则需要使用 std::set

int main() {
sett1; //定义 set 对象 t1

for(int i = 1; i <= 6; ++i) {    // 插入 1 2 3 4 5 6
    t1.insert(i);
}

set<int>::iterator iter;         // 迭代器
for(iter = t1.begin(); iter != t1.end(); ++iter) { // 输出所有元素
    cout<<*iter<<" ";
}
cout<<endl;
//输出为:1 2 3 4 5 6
return 0;

}


输出结果为:



linuxy@linuxy:~/STLset$ g++ -o main main.cpp
linuxy@linuxy:~/STLset$ ./main
1 2 3 4 5 6
linuxy@linuxy:~/STLset$


### 3.3 rbegin()、rend() 方法


函数原型如下所示:



reverse_iterator rbegin() noexcept; // 返回指向最后一个元素的反向迭代器
reverse_iterator rend() noexcept; // 返回指向第一个元素的反向迭代器


下面来看一个例子:



#include
#include // set 容器头文件
using namespace std; // 没有这句,则需要使用 std::set

int main() {
sett1; //定义 set 对象 t1

for(int i = 1; i <= 6; ++i) {    // 插入 1 2 3 4 5 6
    t1.insert(i);
}

set<int>::reverse_iterator riter;         // 使用反向迭代器
for(riter = t1.rbegin(); riter != t1.rend(); ++riter) { // 输出所有元素
    cout<<*riter<<" ";
}
cout<<endl;
//输出为:6 5 4 3 2 1
return 0;

}


输出结果为:



linuxy@linuxy:~/STLset$ g++ -o main main.cpp
linuxy@linuxy:~/STLset$ ./main
6 5 4 3 2 1
linuxy@linuxy:~/STLset$


**注意:**使用反向 迭代器。


### 3.4 lower\_bound()、upper\_bound() 方法


函数原型如下所示:



iterator lower_bound (const value_type& val); // 返回指向等于或大于指定键值元素的迭代器
iterator upper_bound (const value_type& val); // 返回指向大于指定键值元素的迭代器


下面来看一个简单的例子:



#include
#include // set 容器头文件
using namespace std; // 没有这句,则需要使用 std::set

int main() {
sett1; //定义 set 对象 t1

for(int i = 1; i <= 6; ++i) {    // 插入 1 2 3 4 5 6
    t1.insert(i);
}

set<int>::iterator iter = t1.lower_bound(3); // 返回大于等于 3 的第一个元素的迭代器
cout<<*iter<<endl;

iter = t1.upper_bound(3); // 返回大于 3 的第一个元素的迭代器
cout<<*iter<<endl;
return 0;

}


输出结果为:



linuxy@linuxy:~/STLset$ g++ -o main main.cpp
linuxy@linuxy:~/STLset$ ./main
3
4
linuxy@linuxy:~/STLset$


可以看到,lower\_bound 返回 3,而 upper\_bound 返回 4。


### 3.5 erase 方法


#### 3.5.1 删除指定元素


函数原型如下所示:



iterator erase (const_iterator position); // 删除迭代器 position 指向的元素


下面来看一个例子:



#include
#include // set 容器头文件
using namespace std; // 如果没有这句,则需要使用 std::set

int main() {
sett1; // 定义 set 对象 t1

for(int i = 1; i <= 6; ++i) {    // 插入 1 2 3 4 5 6
    t1.insert(i);
}

set<int>::iterator iter = t1.begin();   // 迭代器
++iter;
t1.erase(iter);                  // 删除元素

for(iter = t1.begin(); iter != t1.end(); ++iter) { // 依次输出元素
    cout<<*iter<<" ";
}
cout<<endl;
// 输出为: 1 3 4 5 6

}


输出结果为:



linuxy@linuxy:~/STLset$ g++ -o main main.cpp
linuxy@linuxy:~/STLset$ ./main
1 3 4 5 6
linuxy@linuxy:~/STLset$


#### 3.5.2 删去区间[first, last)的元素


函数原型如下所示:



iterator erase (const_iterator first, const_iterator last); // 删除[first, last)区间的元素


下面来看一个例子:



#include
#include // set 容器头文件
using namespace std; // 如果没有这句,则需要使用 std::set

int main() {
sett1; // 定义 set 对象 t1

for(int i = 1; i <= 6; ++i) {    // 插入 1 2 3 4 5 6
    t1.insert(i);
}

set<int>::iterator iter2 = t1.begin(), iter1;   // 迭代器
++iter2;
iter1 = iter2;
++iter2;
++iter2;
t1.erase(iter1, iter2);                  // 删除 [iter1, iter2) 区间的元素

for(iter1 = t1.begin(); iter1 != t1.end(); ++iter1) { // 依次输出元素
    cout<<*iter1<<" ";
}
cout<<endl;
// 输出为: 1 4 5 6

}


输出结果为:



linuxy@linuxy:~/STLset$ g++ -o main main.cpp
linuxy@linuxy:~/STLset$ ./main
1 4 5 6
linuxy@linuxy:~/STLset$


### 3.6 insert 方法


函数原型如下所示:



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


下面来看一个例子:



#include
#include // set 容器头文件
using namespace std; // 没有这句,则需要使用 std::set

int main() {
sett1; //定义 set 对象 t1

for(int i = 1; i <= 6; ++i) {    // 插入 1 2 3 4 5 6
    t1.insert(i);
}

set<int>::iterator iter;         // 迭代器
for(iter = t1.begin(); iter != t1.end(); ++iter) { // 依次输出插入的元素
    cout<<*iter<<" ";
}
cout<<endl;
// 输出为: 1 2 3 4 5 6

}


输出结果为:



linuxy@linuxy:~/STLset$ g++ -o main main.cpp
linuxy@linuxy:~/STLset$ ./main
1 2 3 4 5 6
linuxy@linuxy:~/STLset$


### 3.7 find 方法


函数原型如下所示:



iterator find (const value_type& val); // 返回指向 val 元素的迭代器


下面来看一个例子:



#include
#include // set 容器头文件
using namespace std; // 如果没有这句,则需要使用 std::set

int main() {
sett1; // 定义 set 对象 t1

for(int i = 1; i <= 6; ++i) {    // 插入 1 2 3 4 5 6
    t1.insert(i);
}

set<int>::iterator iter;         // 迭代器
iter = t1.find(5);               // 查找元素 5
if(iter != t1.end()) {
    cout<<*iter<<endl;
}
// 输出为:5

}


输出结果为:


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值