算法小笔记0424
1
在 C++ 中,multiset
是一种容器适配器,它允许存储多个具有相同键的元素。它是 set
的一个变体,与 set
不同的是,multiset
允许重复的元素。multiset
中的元素按照特定的排序标准自动排序,这个排序标准是在容器创建时指定的。
下面是一个使用 multiset
的简单示例:
#include <iostream>
#include <set>
using namespace std;
int main() {
// 创建一个 multiset,其中存储的元素将按照内置的 lessThan 函数自动排序
multiset<int> nums;
// 添加一些元素
nums.insert(3);
nums.insert(1);
nums.insert(4);
nums.insert(1); // multiset 允许重复元素
// 输出 multiset 中的元素
for (const int num : nums) {
cout << num << ' ';
}
cout << endl;
// 删除所有的 1
nums.erase(1);
// 再次输出 multiset 中的元素
for (const int num : nums) {
cout << num << ' ';
}
cout << endl;
return 0;
}
在这个示例中,我们创建了一个 multiset
来存储整数。我们添加了一些整数,包括重复的 1
。由于 multiset
会自动排序,所以输出时元素是按照升序排列的。然后我们删除了所有的 1
,并再次输出剩余的元素。
multiset
的主要特点是:
- 元素按照排序标准自动排序。
- 元素可以重复。
- 插入和删除操作通常是对数时间复杂度。
- 不允许通过迭代器直接修改元素值,因为这会破坏元素的排序顺序。
multiset
通常在需要快速查找、插入和删除,并且不需要唯一性保证的情况下使用。
2
在 C++ 中,#pragma GCC optimize(2)
是一个编译指示,用于告诉 GCC 编译器以特定的优化级别编译代码。这个指示是 GCC 特有的,不会在其他编译器中产生效果。
#pragma GCC optimize
指示可以接受多个参数,其中 2
表示的是一个特定的优化级别。GCC 的优化级别通常从 0
到 3
,其中 0
表示没有优化(-O0
),1
表示一级优化(-O1
),2
表示二级优化(-O2
),3
表示三级优化(-O3
)。这些优化级别会逐渐增加编译器对代码执行的优化程度,可能会包括循环展开、函数内联、指令重排等。
下面是一个使用 #pragma GCC optimize(2)
的示例:
#include <iostream>
int main() {
// 告诉 GCC 使用二级优化
#pragma GCC optimize(2)
// 你的代码
int sum = 0;
for (int i = 0; i < 1000000; ++i) {
sum += i;
}
std::cout << "Sum: " << sum << std::endl;
return 0;
}
在这个示例中,我们告诉 GCC 对 main
函数中的代码使用二级优化。这可能会使得这段代码运行得更快,因为编译器会尝试优化循环和相关的计算。
需要注意的是,优化级别 2
通常是一个很好的平衡点,因为它提供了适度的优化而不会像 3
那样可能导致编译时间显著增加或代码大小显著增大。然而,优化并不总是能够提高程序的运行速度,有时候它可能会导致代码大小增加或者特定情况下的性能下降。因此,在使用优化时,应该对程序的性能进行测试,以确保优化确实带来了预期的效果。