C++ 无法将std::iota与std::set一起使用
我想创建一组数字:0,1,2,3,4。。。 以下代码无法编译:C++ 无法将std::iota与std::set一起使用,c++,visual-c++,c++11,stl,C++,Visual C++,C++11,Stl,我想创建一组数字:0,1,2,3,4。。。 以下代码无法编译: std::set<int> s; std::iota(s.begin(), s.end(), 0); 编译器是VC++2012。同样的代码适用于向量。我应该如何使用它与一套 更新 我现在可以看出我的代码是毫无意义的,因为没有指定设置大小 以下是关于我的问题的更多细节 我有一个集合,包含[0,N]范围内的一些数字。在我的应用程序中,我需要多次计算这类集合的集合差。N是固定的 假设N=5,第一组是s1={0,3,4}。我需
std::set<int> s;
std::iota(s.begin(), s.end(), 0);
编译器是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
计算这些差异。集合与向量的不同之处在于,向量的索引与该索引中存储的值之间存在关联,而集合只有值是否在集合中的信息。因此,给集合元素赋值是毫无意义的——而强制执行它的方法是集合中的元素是常量
等效的方法是删除集合中不需要的值(向量中的“旧”值),然后迭代要存储的值(使用itoa,这将是一系列递增的值)然后将它们一个一个地添加到集合中。要解决实际问题:
std::set\u差异与std::set
的关系要比您预期的小。您可以使用任意一对迭代器作为set_difference
的前两个参数,前提是它们按顺序返回值。作为一个集合并没有什么特别的好处
例如,包含值0的std::vector
的开始/结束迭代器。。。按顺序n-1可以工作,或者一对boost::counting\u迭代器:
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())
);
如果有人告诉你循环是用于WESSES,而真正的C++程序员使用算法,那么如果你真的想要的话,你可以得到 iToAt/Cuth>:
std::set<int> s;
{
std::vector<int> vec(n);
std::iota(vec.begin(), vec.end(), 0);
s.insert(vec.begin(), vec.end());
}
std::set s;
{
std::vec(n);
标准::物联网(向量开始(),向量结束(),0);
s、 插入(vec.begin(),vec.end());
}
不幸的是,这有点低效。因此,如果您非常喜欢算法,不妨将其与之结合,那么您可以访问标准库以外的地方:
std::set<int> s(boost::counting_iterator<int>(0), boost::counting_iterator<int>(n));
std::set s(boost::counting_迭代器(0),boost::counting_迭代器(n));
有点不雅观的选择:
set<int> s;
generate_n(inserter(s, s.end()), 10, [&]{ return s.size(); });
set;
生成(插入器(s,s.end()),10,[&]{返回s.size();});
对于std::vector
,这将是不可操作的。你想解决什么问题?我不确定这个静态变量,当你运行两次代码时会发生什么?(不复制和粘贴,这是可以的,因为相同的lambda表达式仍然是不同的类型。我的意思是执行相同的行两次)。你可以只做inti=0但是,在前一行中,代码>并通过引用捕获它。我认为任何事情都不太棘手,因为练习的目的是要避免更短、更清晰的循环;-)不过,我想检查generate\n
的标准是否保证函数相对于赋值的执行顺序。任何人都没有理由实现generate\n
来“预读”,但如果不禁止,那么代码就不是严格正确的parallel_generate_n
,有人吗?这句话似乎强烈暗示了这一点,但似乎没有明确保证:“第二个算法调用函数对象gen,并通过范围[first,first+n]中的所有迭代器分配gen的返回值。”“因此,如果你非常喜欢算法,那么不妨将它们结合起来,这样你就可以接触到标准库之外的东西了”。哈哈,对于真理和娱乐,为什么不也添加一个答案:直接通过计数迭代器来设置差分的那个…
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(); });