集合范围构造函数的C++行为
C++ Behavior of set range constructor?
如果我有一个向量有很多重复元素,那么我就从这个向量构造一个集合。
#include <iostream>
#include <set>
#include <vector>
using namespace std;
int main ()
{
vector<pair<int,int> > myvec={{1,1},{1,2},{1,3},{2,1},{2,2},{2,3},{3,1},{3,2},{3,3}};
auto comp=[](pair<int,int> a,pair<int,int> b){return a.first<b.first;};
set<pair<int,int>, decltype(comp)> myset(myvec.begin(),myvec.end(),comp);
for (auto p:myset)
cout<<p.second<<endl;
return 0;
}
我的问题是,是否保证这些元素将按照向量的顺序插入到集合中,比如:
for (auto p:myvec)
myset.insert(p);
来自std::set
:的MSVC实现
template<class _Iter>
void insert(_Iter _First, _Iter _Last)
{ // insert [_First, _Last)
_DEBUG_RANGE(_First, _Last);
for (; _First != _Last; ++_First)
this->emplace(*_First);
}
此方法是从您使用的构造函数中调用的。因此,这是这种实施的保证。然而,我不确定这种行为是否得到了标准的保证。
IMO和为了可读性,我建议你在比较器中清楚地说明你想要的顺序,如下所示:
auto comp=[](std::pair<int,int> a,std::pair<int,int> b){
if(a.first==b.first){
return a.second<b.second;
}
return a.first<b.first;
};
"我有一个向量,它有很多重复元素"。通过这种假设,您只关心对的第一个组件,这在您的代码中是显而易见的。由于当时使用了"set","set"中的所有元素都将是唯一的,并且处于严格弱排序,即递增顺序(根据"comp"二进制谓词)。因此,如果向量中的元素(考虑到对的第一部分)已经按排序顺序排列,则可以保证元素将按向量中对的第一个部分的顺序插入集合中。
myset中的最终值={1,1}{2,1}{3,1}。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- arr[-1]在c++中的奇怪行为
- 继承期间显示未知行为的子类
- 如何在c++中使用引用实现类似python的行为
- G锁定铸造到基础上会释放模拟行为
- 在C++中对T*类型执行std::move的意外行为
- std::当在256字节边界上写入整数时,流的奇怪行为
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 奇怪的构造函数行为
- 重载运算符new[]的行为取决于析构函数
- 不同语言中相同代码的不同行为
- 处理除以零会导致<csignal>意外行为
- 试图理解类对象的行为
- c++11评估顺序(未定义的行为)
- 从结构寻址时,MMAP变量的行为很奇怪
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 读取文件时运行时的未知行为
- strncpy之后的char数组的错误行为
- 此增量后语句是否会导致未定义的行为?