河畔石上数(C++)

在 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 并向下取整到最接近的整数,这些整数中会有多少种不同的值出现。

作为年轻人,请你解开这个难题。

输入格式

无。

输出格式

输出一个整数,表示从 \frac{1^{2}}{82} 到 \frac{1000^{2}}{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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值