在multiset上的std :: transform给了我错误C3892

时间:2016-07-31 06:30:57

标签: c++ stl multiset

我试图理解std :: transform函数是如何工作的,但我在使用下面的代码时遇到了一些麻烦。我想取一个多节ms,在每个元素的内容中加1并将它们存储在一个新的multiset msc中。这就是我所拥有的:

int op_increase(int i) { return ++i; }

int main()
{

std::multiset<int> ms = {1,1,2,2,3};
std::multiset<int> msc;
std::transform(ms.begin(), ms.end(), msc.begin(), op_increase);

return 0;
}

但是我收到以下错误:

C3892:_Dest:你不能分配给const

的变量

2 个答案:

答案 0 :(得分:3)

您的代码未使用允许插入空容器的std::transform正确参数。这需要使用一个足够智能的迭代器来调用调用容器的insert()函数的相应函数。

解决方案是提供std::transform自动插入空std::inserter的{​​{1}}迭代器。这是一个例子:

multiset

注意使用了#include <set> #include <algorithm> #include <iterator> int op_increase(int i) { return ++i; } int main() { std::multiset<int> ms = {1,1,2,2,3}; std::multiset<int> msc; std::transform(ms.begin(), ms.end(), std::inserter(msc, msc.begin()), op_increase); // msc now contains 2,2,3,3,4 } ,而不仅仅是std::inserter。插入器会自动将项目插入到地图中。

Live Example

答案 1 :(得分:2)

此处的问题是std::multiset<T>::begin()返回std::_Tree_const_iterator类型。这就是为什么你无法改变其价值的原因。这种行为是明智的:std::multiset,如std::set,是一个典型地实现为红黑树的已排序容器,因此更改一个元素的值可能需要更新整个数据结构。如果用户真的想这样做,他可能会删除一个节点并将其添加回来。

为了更好地理解std::transform行为,您可以使用std::vector容器而不是std::multisetCplusplus.com包含使用std::transform的代码的一个很好的示例。

另外,据我所知,您可以尝试将结果数据添加到最初为空的std::multiset中。要实现此功能,您可以使用std::insert_iteratorCplusplus.com),如下所示:

int op_increase(int i) { return ++i; }

int main()
{
    std::multiset<int> ms = {1,1,2,2,3};
    std::multiset<int> msc;
    std::transform(ms.begin(), ms.end(), inserter(msc, msc.begin()), op_increase);
    return 0;
}