Max*_*Max 4 c++ stl visual-c++ c++11
我想创建一组数字:0,1,2,3,4 ......以下代码无法编译:
std::set<int> s;
std::iota(s.begin(), s.end(), 0);
Run Code Online (Sandbox Code Playgroud)
带有以下错误消息:
error C3892: '_First' : you cannot assign to a variable that is const
Run Code Online (Sandbox Code Playgroud)
编译器是VC++ 2012.相同的代码适用于矢量.我应该如何使用它?
UPDATE
我现在可以看到我的代码没有意义,因为没有指定设置大小.
以下是有关我的问题的更多详细信息.
我有一个包含[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
计算这些差异.
Ste*_*sop 12
解决您的实际问题:std::set_difference
与std::set
您的预期相关性较小.您可以使用任意一对迭代器作为前两个参数,set_difference
前提是它们按顺序返回值.作为一套,没有特别的好处.
因此,例如,std::vector
按顺序包含值0 ... n-1 的a的开始/结束迭代器将起作用,或者是一对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())
);
Run Code Online (Sandbox Code Playgroud)
输出也不需要是一个集合,你也可以使用vector
with back_inserter
.
要解决你的问题:尝试iota
在集合上使用是没有意义的.iota
通过为它们分配新值来更改范围中包含的值.您无法分配给a中的值set
.
如果你想要一个包含数字的集合0 ... n-1
,那么:
std::set<int> s;
for (int i = 0; i < n; ++i) {
s.insert(s.end(), i);
}
Run Code Online (Sandbox Code Playgroud)
如果有人告诉你循环是为了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());
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种效率低下.因此,如果您非常喜欢算法,以至于您可以将它们结合起来,那么您可以到达标准库之外:
std::set<int> s(boost::counting_iterator<int>(0), boost::counting_iterator<int>(n));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2198 次 |
最近记录: |