由于我昨天的post在这里再次投票,只有最小的例子和我的问题。
#include <set>
#include <algorithm>
using namespace std;
class dummy
{
public:
dummy(int x)
: test(x)
{}
bool operator()(const int &a) const
{
return false;
}
protected:
int test;
};
void foo()
{
// Determine the bounding box.
multiset<float> test;
test.insert(3.5);
multiset<float>::iterator itVertex = test.begin();
multiset<int> workset;
workset.insert(3);
for (itVertex = test.begin(); itVertex != test.end(); itVertex++)
{
multiset<int>::iterator itEnd = remove_if(workset.begin(), workset.end(), dummy(3));
}
}
我在两台机器上测试了这个例子:在Linux(Ubuntu 16.04,g ++ 5和6)上,我得到了前面描述的错误:
/ usr / include / c ++ / 5 / bits / stl_algo.h:868:23:错误:分配只读位置'__result.std :: _ Rb_tree_const_iterator&lt; _Tp&gt; :: operator *()' __ result = _GLIBCXX_MOVE( __ first);
在Windows 7 Visual Studio 2008上,它编译得很好。
我还查看了重复项,但他们未能描述 Windows 工作但 的情况 Linux 上。
那为什么它在Windows上编译好呢?为什么不在Linux上?我理解如何解决问题本身,但由于这是外部代码,如果没有必要,我不想编辑代码本身。
答案 0 :(得分:1)
cursor.rowcount
无法使用多重播放。它只适用于可以重新排序的容器,因为要移除的元素会暂时被其他元素覆盖,这些元素会填补空白。
使用std::remove_if
,您无法覆盖给定迭代器的值,因为迭代器是已定义的排序函数和当前内容的乘积。
如果这适用于MSVC,那么该STL实现的功能超出了标准要求。不能安全地依赖它,因为它没有保证。