set_intersection具有重复值
Set_Intersection with repeated values
我认为set_intersection stl函数在此处描述:http://www.cplusplus.com/reference/reference/algorithm/set_intersection/在数学意义上并不是真正的相交。假设给出的示例我更改了行:
int first[] = {5,10,15,20,20,25};
int second[] = {50,40,30,20,10,20};
结果,我想获得10 20 20。但是我只得到独特的答案。STL中是否有真实的相交?
我知道合并和set_differences的结合,顺便说一句。只是检查我是否缺少明显的东西。
结果,我想获得10 20 20。但是我只得到独特的答案。STL中是否有真实的相交?
std::set_intersection
的工作方式。
您可能会得到错误的答案,因为您没有正确更新代码。如果将集合更改为具有6个元素,则需要更新排序它们的行:
std::sort (first,first+5); // should be first+6
std::sort (second,second+5); // should be second+6
,还将呼叫更改为set_intersection
以使用first+6
和second+6
。否则,您只能对每组的前5个元素进行排序,并且仅获取前5个元素的交点。
显然,如果您不在输入中包含重复值,则不会在输出中。如果您正确更改代码以包含所有输入值,则它将按照您的需求工作(实时示例)。
cplusplus.com不是一个很好的参考,如果您查看http://en.cppreference.com/w/cpp/algorithm/set_intersection,您会看到它清楚地说明了重复元素的行为:
如果在[FIRST1,LAST1)和[FIRST2,LAST2)中找到了某些元素,则第一个
std::min(m, n)
元素将从第一个范围复制到目标范围。
即使是cplusplus.com上的示例也很糟糕,如果它是用惯用的现代c 编写的,它会更简单,并且很难介绍您的错误:
#include <iostream> // std::cout
#include <algorithm> // std::set_intersection, std::sort
#include <vector> // std::vector
int main () {
int first[] = {5,10,15,20,20,25};
int second[] = {50,40,30,20,10,20};
std::sort(std::begin(first), std::end(first));
std::sort(std::begin(second), std::end(second));
std::vector<int> v;
std::set_intersection(std::begin(first), std::end(first),
std::begin(second), std::end(second),
std::back_inserter(v));
std::cout << "The intersection has " << v.size() << " elements:n";
for (auto i : v)
std::cout << ' ' << i;
std::cout << 'n';
}
这将自动处理正确的元素,而无需明确说5
或6
或任何其他魔术号码,而无需在输出向量中创建初始元素,然后将其调整大小以再次删除它们。
set_intersection
都需要对两个范围进行排序。在您给出的数据中,second
未排序。
如果首先排序,则应该得到预期的答案。
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- google test PrintTo for std::set<std::string>