set.emplace
时间: 2023-11-23 22:51:42 浏览: 188
set.emplace 是 C++ STL 中 set 容器的一个成员函数,用于在 set 容器中插入一个元素。与 set.insert 不同的是,emplace 可以直接在 set 中构造元素,而不需要先构造一个元素再插入。
emplace 的语法如下:
```
template <class... Args>
std::pair<iterator,bool> emplace (Args&&... args);
```
其中 Args 表示可变参数模板,可以接受任意数量、任意类型的参数。emplace 函数会将这些参数传递给 set 中元素的构造函数,直接在 set 中构造一个新元素。
emplace 函数返回一个 pair 对象,其中第一个元素是一个迭代器,指向新插入的元素;第二个元素是一个 bool 类型的值,表示插入是否成功。
例如,我们可以使用 emplace 函数向 set 中插入一个 pair 对象:
```c++
std::set<std::pair<int, std::string>> myset;
myset.emplace(1, "hello");
```
这样就会在 myset 中插入一个键值为 1,值为 "hello" 的 pair 对象。
相关问题
unordered_set用法emplace
unordered_set是C++标准库中的一个容器,它提供了一种无序的、不重复的元素集合。emplace函数是unordered_set中的一个成员函数,用于在集合中插入新元素。
emplace函数的作用是在unordered_set中就地构造一个新元素,并将其插入到集合中。与insert函数不同的是,emplace函数可以直接使用元素的构造函数参数来构造新元素,而不需要先创建一个临时对象。
下面是emplace函数的用法示例:
```cpp
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> mySet;
// 使用emplace函数插入新元素
mySet.emplace(1);
mySet.emplace(2);
mySet.emplace(3);
// 输出集合中的元素
for (const auto& element : mySet) {
std::cout << element << " ";
}
std::cout << std::endl;
return 0;
}
```
输出结果为:1 2 3
在上述示例中,我们使用emplace函数分别插入了三个整数元素到unordered_set中。由于emplace函数可以直接使用构造函数参数来构造新元素,因此我们可以直接传入整数值作为参数,而不需要先创建一个临时对象。
int choose; std::cout << "请选择数据集(1、小数据, 2、大数据,3、随机图 ,else: 自行输入):\n"; std::cin >> choose; FILE* fp = nullptr; switch (choose) { case 1: fp = freopen(R"(C:\Users\28492\Desktop\szu\算法\Project5\mediumDG.txt)", "r", stdin); break; case 2: fp = freopen(R"(C:\Users\28492\Desktop\szu\算法\Project5\largeG.txt)", "r", stdin); break; default: cout << "请输入样例:" << endl; break; } cin >> n >> e; adj.clear(), adj.resize(n); int tag = 1; for (int i = 0; i < e; ++i) { int x, y; cin >> x >> y; if (x > y) swap(x, y); if (x == y) { continue; } if (cir_edges.count({ x, y })) continue; adj[x].emplace_back(y), adj[y].emplace_back(x); cout << tag; edges[tag++] = {x,y}; //order[x][y] = tag - 1; //标记每个边对应的下标 cir_edges.insert({ x, y }); }
这段代码是一个读取图数据的过程,根据用户选择的数据集,从相应的文件中读取图的节点数n和边数e,然后按照边的起点和终点构建邻接表,并且将边存储在一个vector中。其中,adj是邻接表,用vector实现;tag是一个整数变量,用于计数;edges是一个vector,用于存储边;cir_edges是一个set,用于存储已经出现过的边,避免出现重复边。
这段代码有几个需要注意的地方:
1. 文件路径
在使用freopen函数打开文件时,需要传入文件的路径。需要确保文件路径是正确的,否则会打开失败。
2. 输入格式
读取图数据时,需要按照固定的格式读入节点数n和边数e,然后按照边的起点和终点读入每条边。需要确保输入格式正确,否则会出现意想不到的错误。
3. 边的存储
这段代码使用了一个vector来存储图的边,可以根据需要对边进行排序、查找等操作。需要确保边的起点和终点的数据类型与vector中定义的一致,否则会出现类型不匹配的错误。
4. 重复边的处理
在读取图数据的过程中,可能会出现重复的边,需要进行处理。这段代码使用了一个set来存储已经出现过的边,避免出现重复边。
阅读全文