C++ set如何处理唯一的键,但在C++;? vectorv; //使用索引比较数据对 自动函数=[&](inti,intj){返回v[i]>v[j];}; //设置用于存储索引和比较键的 //func基于v中的值 集合索引集合(func);

C++ set如何处理唯一的键,但在C++;? vectorv; //使用索引比较数据对 自动函数=[&](inti,intj){返回v[i]>v[j];}; //设置用于存储索引和比较键的 //func基于v中的值 集合索引集合(func);,c++,set,g++,C++,Set,G++,如果我有两个相同的值v[0]={1,2}和v[1]={1,2},我将它们插入索引集,即 索引集插入(0); 索引集插入(1); 现实: 我将在索引集(索引集.size()=1)中只有一个元素,这是唯一的索引0,索引1 期望值:必须同时插入0和1 理由: 据报道,它说: Unique keys No two elements in the container can have equivalent keys. 因为键不是等价的(0!=1),所以集合应该同时包含0和1。为什么这种行为是正

如果我有两个相同的值
v[0]={1,2}
v[1]={1,2}
,我将它们插入
索引集
,即

索引集插入(0);
索引集插入(1);
现实: 我将在
索引集
索引集.size()=1
)中只有一个元素,这是唯一的索引
0
,索引
1

期望值:必须同时插入
0
1

理由: 据报道,它说:

Unique keys
    No two elements in the container can have equivalent keys.
因为键不是等价的(
0!=1
),所以集合应该同时包含
0
1
。为什么这种行为是正当的?我认为我混淆了键的值和键的文字值

最小、完整、可验证的示例

在页面下方进一步说明:

比较 ...
set
对象使用此表达式来确定元素在容器中遵循的顺序以及两个元素键是否相等(通过反射性比较:如果
!comp(a,b)&&!comp(b,a)
,则它们相等)。
集合
容器中没有两个元素是等效的


您已经指定了一个自定义比较函数,该函数声明应将元素
0
1
视为相等。因此,您的
std::set
将只保留其中一个。

您使用的比较功能不是很直观。它的实现方式,
0
1
被认为是等效的。如果先插入
1
,则不会插入
0

如果你有

v[0] = {1, 2};
v[1] = {1, 2};
v[2] = {2, 2};
v[3] = {1, 2}

然后,
0
1、
3
集而言将被视为等价的。

@Galik,编辑是否有用?您能提供一个示例,以便我们更好地了解发生了什么吗?@jamesdlin@Galik,我认为键的唯一性在于键的值(
0
1
)与按键所持有的值不同(
v[0]
v[1]
)。这造成了混乱,因为根据我的说法,set将存储在其BST值
0
1
中,并将使用比较器比较键(严格来说更少),但键的值也使用相同的比较器进行比较,因此会造成混乱。但您的值不仅仅是
0
1
。通过您提供的比较器,您的值有更多与之相关的信息,该比较器将这些值链接到该附加信息。@madhur4127您对键唯一性的看法不会改变标准
std::set
实际用于确定键唯一性的标准,该标准由比较函数指定。另外,对于
std::set
,键和值是相同的。如果希望它们不同,应该使用
std::map