std::transform 在多重集上给我错误 C3892
std::transform on a multiset giving me error C3892
我想了解 std::transform 函数的工作原理,但我在使用以下代码时遇到了一些问题。我想取一个 multiset 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
的变量
这里的问题是 std::multiset<T>::begin()
returns 一个 std::_Tree_const_iterator
类型。这就是为什么你不能改变它的价值。这种行为是明智的:std::multiset
和 std::set
一样,是一个排序容器,通常实现为红黑树,因此改变一个元素的值可能需要更新整个数据结构。如果用户真的想这样做,他可以删除一个节点并将其添加回来。
为了更好地理解 std::transform
行为,您可以使用 std::vector
容器而不是 std::multiset
。 Cplusplus.com 包含使用 std::transform
.
的很好的代码示例
此外,据我从您的代码中了解到,您尝试将结果数据添加到最初为空的 std::multiset
。要实现此功能,您可以使用 std::insert_iterator
(Cplusplus.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;
}
您的代码没有使用允许插入空容器的 std::transform
的正确参数。这需要使用足够智能的迭代器来调用调用容器的 insert()
函数的适当函数。
解决方案是提供std::transform
std::inserter
自动插入空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
,而不仅仅是 msc.begin()
。插入器会自动将项目插入到地图中。
我想了解 std::transform 函数的工作原理,但我在使用以下代码时遇到了一些问题。我想取一个 multiset 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
的变量这里的问题是 std::multiset<T>::begin()
returns 一个 std::_Tree_const_iterator
类型。这就是为什么你不能改变它的价值。这种行为是明智的:std::multiset
和 std::set
一样,是一个排序容器,通常实现为红黑树,因此改变一个元素的值可能需要更新整个数据结构。如果用户真的想这样做,他可以删除一个节点并将其添加回来。
为了更好地理解 std::transform
行为,您可以使用 std::vector
容器而不是 std::multiset
。 Cplusplus.com 包含使用 std::transform
.
此外,据我从您的代码中了解到,您尝试将结果数据添加到最初为空的 std::multiset
。要实现此功能,您可以使用 std::insert_iterator
(Cplusplus.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;
}
您的代码没有使用允许插入空容器的 std::transform
的正确参数。这需要使用足够智能的迭代器来调用调用容器的 insert()
函数的适当函数。
解决方案是提供std::transform
std::inserter
自动插入空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
,而不仅仅是 msc.begin()
。插入器会自动将项目插入到地图中。