在C++ STL中的unordered_multiset insert()函数
unordered_multiset是C++ STL中的一个容器,它可以存储一组无序的元素。在插入元素时,它提供了insert()函数。本文将着重讲解unordered_multiset的insert()函数。
基本语法
unordered_multiset中的insert()函数有多个重载版本,这里主要讲解两个常用版本的基本语法。
insert(const value_type& val)
第一个版本的insert()函数带有一个参数,用于将元素val插入到unordered_multiset中。
#include <iostream>
#include <unordered_set>
int main()
{
std::unordered_multiset<int> myset = {1, 2, 2, 3, 3, 3};
myset.insert(4);
for(int i : myset)
{
std::cout << i << " ";
}
std::cout << std::endl;//1 2 3 4
return 0;
}
这个例子中,unordered_multiset初始化了一个包含1,2,2,3,3,3这6个元素的集合。然后,使用insert()函数将4插入到集合中,并使用for循环打印输出集合中的所有元素。结果显示,集合中元素的顺序被打乱并去重了:1 2 3 4。
insert(InputIterator first, InputIterator last)
第二个版本的insert()函数带有两个参数,用于将[first, last)范围内的所有元素插入到unordered_multiset中。
#include <iostream>
#include <vector>
#include <unordered_set>
int main()
{
std::vector<int> myvec = {4, 5, 5, 6, 6, 6};
std::unordered_multiset<int> myset = {1, 2, 2, 3, 3, 3};
myset.insert(myvec.begin(), myvec.end());
for(int i : myset)
{
std::cout << i << " ";
}
std::cout << std::endl;//1 2 3 4 5 6
return 0;
}
这个例子中,定义了一个vector myvec和一个unordered_multiset myset,并将它们初始化为{4, 5, 5, 6, 6, 6}和{1, 2, 2, 3, 3, 3}。然后,使用insert()函数将myvec中的所有元素插入到myset中,并使用for循环打印输出myset中的所有元素。结果显示,myset中的元素被打乱并去重了:1 2 3 4 5 6。
示例代码
案例1:插入元素
unordered_multiset可以很方便地插入一个元素,在insert函数中只需简单地传递元素值即可。以下代码演示了如何在向unordered_multiset中插入元素:
#include <iostream>
#include <unordered_set>
int main()
{
std::unordered_multiset<int> myset = {1, 2, 2, 3, 3, 3};
myset.insert(4);
for(int i : myset)
{
std::cout << i << " ";
}
std::cout << std::endl;//1 2 3 4
return 0;
}
案例2:插入多个元素
在unordered_multiset中,可以使用insert函数插入多个元素。
#include <iostream>
#include <vector>
#include <unordered_set>
int main()
{
std::vector<int> myvec = {4, 5, 5, 6, 6, 6};
std::unordered_multiset<int> myset = {1, 2, 2, 3, 3, 3};
myset.insert(myvec.begin(), myvec.end());
for(int i : myset)
{
std::cout << i << " ";
}
std::cout << std::endl;//1 23 4 5 6
return 0;
}
案例3:使用插入器插入元素
在C++11之前,向容器中插入值只能使用insert函数,需要手动创建一个值然后传递到insert函数中。但是从C++11开始,我们可以使用插入器对元素进行插入、移动或分配,插入器是一个类似于类的结构。在以下代码中,我们将插入器插入两个值并将结果打印出来。
#include <iostream>
#include <unordered_set>
int main()
{
std::unordered_multiset<int> myset = {1, 2, 2, 3, 3, 3};
struct IntHasher // 插入器
{
std::size_t operator()(const int& val) const
{
return std::hash<int>()(val);
}
};
auto result = myset.emplace_hint(myset.begin(), 4); // emplace_hint接受指针参数
myset.insert( result, 5 );
for(int i : myset)
{
std::cout << i << " ";
}
std::cout << std::endl;//1 2 3 4 5
return 0;
}
案例4:使用迭代器插入元素
在许多情况下,插入值会受到数据结构的限制,并且可能会导致缩小容器。在这种情况下,迭代器可以用于指示函数在相应位置进行插入。 您可以使用insert或emplace函数的原始形式,也可以使用emplace_hint。 在以下代码示例中,您可以看到emplace_hint正在插入值。
#include <iostream>
#include <unordered_set>
int main()
{
std::unordered_multiset<int> myset = {1, 2, 2, 3, 3, 3};
auto result = myset.emplace_hint(myset.begin(), 4);
myset.insert( result, 5 );
for(int i : myset)
{
std::cout << i << " ";
}
std::cout << std::endl;//1 2 3 4 5
return 0;
}
案例5:使用initializer_list插入元素
Initializer_list在C++中可以直接使用”{}”进行声明,可以将列表分配给变量或参数列表。 unordered_multiset容器支持使用{}插入值。在以下代码示例中,我们可以看到容器中插入了五个值:
#include <iostream>
#include <unordered_set>
int main()
{
std::unordered_multiset<int> myset = {1, 2, 2, 3, 3, 3};
myset.insert({4, 5, 5, 6, 6, 6});
for(int i : myset)
{
std::cout << i << " ";
}
std::cout << std::endl;//1 2 3 4 5 6
return 0;
}
结论
unordered_multiset是一个十分实用的C++ STL容器,它提供了方便易用的insert()函数,可以让用户在插入元素时如鱼得水般自如。在编写代码时,应选择最优的插入方法,以提高程序的效率和正确性。