在 C++ 里,std::set
是标准模板库(STL)提供的一种关联容器,它能高效地存储唯一元素,并且元素会按照特定的顺序排列,默认是升序。下面从多个方面为你详细介绍 std::set
。
1. 头文件包含
若要使用 std::set
,需要包含 <set>
头文件:
#include <set>
2. 定义和初始化
可以按以下方式定义和初始化 std::set
:
#include <iostream>
#include <set>
int main() {
// 定义一个存储整数的 set
std::set<int> mySet;
// 定义并初始化一个 set
std::set<int> anotherSet = {1, 2, 3, 4, 5};
return 0;
}
3. 插入元素
使用 insert
方法向 std::set
中插入元素。由于 std::set
会保证元素的唯一性,若插入的元素已经存在,插入操作将不会产生任何效果。
#include <iostream>
#include <set>
int main() {
std::set<int> mySet;
mySet.insert(10);
mySet.insert(20);
mySet.insert(10); // 插入已存在的元素,不会有效果
for (int num : mySet) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
4. 查找元素
可以使用 find
方法查找某个元素是否存在于 std::set
中。若元素存在,find
方法会返回指向该元素的迭代器;若不存在,则返回 end()
迭代器。
#include <iostream>
#include <set>
int main() {
std::set<int> mySet = {1, 2, 3, 4, 5};
auto it = mySet.find(3);
if (it != mySet.end()) {
std::cout << "元素 3 存在于 set 中" << std::endl;
} else {
std::cout << "元素 3 不存在于 set 中" << std::endl;
}
return 0;
}
5. 删除元素
使用 erase
方法删除 std::set
中的元素。可以通过元素值或者迭代器来指定要删除的元素。
#include <iostream>
#include <set>
int main() {
std::set<int> mySet = {1, 2, 3, 4, 5};
mySet.erase(3); // 通过元素值删除
auto it = mySet.find(4);
if (it != mySet.end()) {
mySet.erase(it); // 通过迭代器删除
}
for (int num : mySet) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
6. 遍历元素
可以使用范围 for
循环或者迭代器来遍历 std::set
中的元素。
#include <iostream>
#include <set>
int main() {
std::set<int> mySet = {1, 2, 3, 4, 5};
// 使用范围 for 循环遍历
for (int num : mySet) {
std::cout << num << " ";
}
std::cout << std::endl;
// 使用迭代器遍历
for (auto it = mySet.begin(); it != mySet.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
7. 特性和复杂度
- 元素唯一性:
std::set
中的元素是唯一的,插入重复元素时会被忽略。 - 自动排序:元素会按照默认的比较规则(通常是升序)自动排序。
- 插入、查找和删除操作的复杂度:平均情况下为 O(logn),这里的 n 是
std::set
中元素的数量。
8. 自定义比较规则
若需要自定义元素的排序规则,可以在定义 std::set
时传入自定义的比较函数或者函数对象。
#include <iostream>
#include <set>
struct Compare {
bool operator()(const int& a, const int& b) const {
return a > b; // 降序排序
}
};
int main() {
std::set<int, Compare> mySet = {1, 2, 3, 4, 5};
for (int num : mySet) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
综上所述,std::set
是一个功能强大的关联容器,适合用于存储唯一元素并进行高效的查找、插入和删除操作。
接下来,看一下这道题
问题描述
在河畔有一排奇特的石头,每块石头上都刻有从 1 到 1000 的自然数的平方。村中的智者为了考验年轻人的洞察力,让他们计算出,如果每个数都除以 82 并向下取整到最接近的整数,这些整数中会有多少种不同的值出现。
作为年轻人,请你解开这个难题。
输入格式
无。
输出格式
输出一个整数,表示从 到
所有不同的整数值的种类数。
解答:
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
for (int i = 1; i <= 1000; ++i) {
int value = (i * i) / 82;
s.insert(value);
}
cout << s.size() << endl;
return 0;
}