为什么 std::set::erase 与 std::set::insert 不一致?
Why std::set::erase is not consistent with std::set::insert?
为什么第二组没有从myset
中减去?myset.insert(second.begin(),second.end())
按预期工作。
// erasing from set
int main ()
{
std::set<int> myset;
std::set<int> second;
std::set<int>::iterator it;
// insert some values:
for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90
for (int i=3; i<5; i++) second.insert(i*10);
myset.erase(second.begin(), second.end()); // Why is the second set not subtracted from myset? myset.insert(second.begin(),second.end()) works as intended.
std::cout << "myset contains:";
for (it=myset.begin(); it!=myset.end(); ++it)
std::cout << ' ' << *it;
std::cout << 'n';
return 0;
}
std::set::erase
需要迭代器到你调用它的集合。 将其迭代器提供给另一个集合将不起作用。 你想要的是你传递给它的两个集合std::set_difference
它将输出一个新集合,其中包含第一个集合中不在第二个集合中的所有元素。 对你来说,这看起来像
std::set diff;
std::set_difference(myset.begin(), myset.end(),
second.begin(), second.end(),
std::inserter(diff, diff.begin()));
擦除将迭代器带入它正在处理的集合中
Removes the elements in the range [first; last), which must be a valid range in *this.
https://en.cppreference.com/w/cpp/container/set/erase
相关文章:
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 修改"std::set"中用户定义类型的值
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 我从 std::set 得到const_iterator而不是迭代器
- 为什么 std:set(带有单个冒号)可以编译?
- 遍历 std::set 中包含的所有三重不同值?
- 插入 std::set 作为 std::map 的键
- 如何在 c++ 中使用默认值将 std::set 转换为 std::map
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- 如何从 std::set 绘制 n 个元素的样本
- 为什么 std::set 容器使用的内存比其数据大小多得多?