Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法将std::iota与std::set一起使用_C++_Visual C++_C++11_Stl - Fatal编程技术网

C++ 无法将std::iota与std::set一起使用

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}。我需

我想创建一组数字: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}
。我需要计算集合差
{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(); });