不能将 std::iota 与 std::set 一起使用
Cannot use std::iota with std::set
我想创建一组数字范围:0、1、2、3、4、...以下代码编译失败:
std::set<int> s;
std::iota(s.begin(), s.end(), 0);
出现以下错误消息:
error C3892: '_First' : you cannot assign to a variable that is const
编译器是VC++2012。相同的代码适用于向量。我应该如何将其与套装一起使用?
更新
我现在可以看到我的代码毫无意义,因为没有指定设置大小。
以下是有关我的问题的更多详细信息。
我有一个集合包含 [0, N] 范围内的一些数字。在我的应用程序中,我需要多次计算此类集合的集合差值。N 是固定的。
假设N = 5
,第一组是s1 = {0, 3, 4}
.我需要计算集合差{0, 1, 2, 3, 4} {0, 3, 4} == {1, 2}
。对于不同的集合,应该经常执行此操作,因此我认为我可以创建一个包含所有数字的集合(在这种情况下{0, 1, 2, 3, 4}
)并使用std::set_difference
来计算这些差异。
要解决您的实际问题:std::set_difference
与std::set
的关系比您预期的要小。您可以使用任何一对迭代器作为set_difference
的前两个参数,前提是它们按顺序返回值。作为一个集合没有特别的好处。
因此,例如包含值 0 的std::vector
的开始/结束迭代器...n-1 按顺序工作,或一对boost::counting_iterator
:
std::set result;
std::set_difference(
boost::counting_iterator<int>(0), boost::counting_iterator<int>(n),
s1.begin(), s1.end(),
std::inserter(result, result.end())
);
输出也不需要是集合,您也可以使用带有back_inserter
的vector
。
为了解决你的问题:尝试在片场使用iota
是没有意义的。 iota
通过为范围中包含的值分配新值来更改这些值。不能分配给set
中的值。
如果你想要一个包含数字的集合 0 ... n-1
,则:
std::set<int> s;
for (int i = 0; i < n; ++i) {
s.insert(s.end(), i);
}
如果有人告诉你循环是用于 wusses 的,而真正的C++程序员使用算法,那么如果你真的想要,你可以参与iota
:
std::set<int> s;
{
std::vector<int> vec(n);
std::iota(vec.begin(), vec.end(), 0);
s.insert(vec.begin(), vec.end());
}
不幸的是,这有点低效。因此,如果你非常喜欢算法,以至于你不妨将它们结合起来,那么你可以超越标准库:
std::set<int> s(boost::counting_iterator<int>(0), boost::counting_iterator<int>(n));
一个有点不优雅的选择:
set<int> s;
generate_n(inserter(s, s.end()), 10, [&]{ return s.size(); });
集合与向量的不同之处在于,向量具有从索引到存储在该索引处的值的关联,而集合仅包含值是否在集合中的信息。 因此,将值分配给 set 元素是荒谬的——强制执行它的方法是集合中的元素是恒定的。
等效的方法是删除集合中不需要的值(向量情况下为"旧"值),然后遍历要存储的值(使用 itoa 它将是一系列递增的值)并将它们逐个添加到集合中。
- 将fold表达式与std::一起用于两个元组
- 将 std::allocate_shared 与多态资源分配器一起使用
- 将 std::set 与基于键的比较器一起使用
- 如何将AERT_Allocate与 std:vector 一起使用
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 将图形属性与 std::unique_ptr 捆绑在一起
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- 将新放置与 std::函数一起使用不起作用
- 不能将C++的"std::filesystem"库与介子构建一起使用
- 将 std::function 与模板一起使用
- 是否可以将 std::basic_ifstream 和 std::basic_ofstream 与自定义缓冲区一起使用?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 如何将 std::find() 与 2d std: 数组一起使用?
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 将 std::transform 与 std::back_inserter 一起使用是否有效?
- 为什么使用与父级声明的 std::function 在与子级一起使用时会显示错误?
- 是否已经有一个 constexpr std::bit_cast 与 g++ 一起使用
- 将 std::variant 与 gmock 1.8 对象一起使用时编译错误
- 我不能将 'fill' std::vector 构造函数与 unique_ptrs 一起使用