STL预定义仿函数transform问题

#include<iostream>#include<list>#include<algorithm>#include<set>#include<iterator>usi... #include<iostream>
#include<list>
#include<algorithm>
#include<set>
#include<iterator>

using namespace std;

class print
{
public:
void operator()(int num) const
{
cout<<num<<" ";
}
};

int main()
{
set<int,greater<int>> se;
set<int>::const_iterator ter;
for(int i=1;i<10;i++)
{
se.insert(i);
}

for_each(se.begin(),se.end(),print());
cout<<endl;

transform(se.begin(),se.end(),se.begin(),negate<int>());
transform(se.begin(),se.end(),se.begin(),se.begin(),multiplies<int>());
for_each(se.begin(),se.end(),print());
cout<<endl;
return 0;
}

上面代码两处transform处都编译不通过,点解?
展开
 我来答
麦兜族1990
2012-04-09 · TA获得超过114个赞
知道答主
回答量:54
采纳率:0%
帮助的人:72.3万
展开全部
上面这个仁兄的解释可圈可点,但是有些东西解释的还是误导了你。
首先,你这个程序中只是声明了一个常量迭代器,而并没有使用它,所以这对你的程序并没有不良影响(就此例而言)。
其次,这个程序的问题在于 set<int,greater<int>> se; 因为你没有将<int>>此处的两个 > 用空格分开,所以编译器会当作一个输入流操作符使用,于此例当然编译通不过。所以你只需这样即可:set<int,greater<int> > se;
你这是在看C++标准程序库吧,一定要仔细看哦,有很多细节都有解释,比如你的这个问题。
希望对你有帮助。
Irreappearable
2012-04-08 · TA获得超过4957个赞
知道大有可为答主
回答量:1423
采纳率:25%
帮助的人:3186万
展开全部
这并不是transform函数的问题,如果你用vector来做这个transform 那将没有问题
但很不幸的是,set的iterator是不能用来修改的(也就是所谓的Immutable的)

这点你可以用以下代码确认:
set<int> s;
set<int>::iterator i = s.begin();
*i = 1;
以上代码是不能通过编译的,道理和你上面的代码一样,因为*i返回的是const int&,所以不能修改。

set不能修改的原因也很简单,因为set的实现需要维护集合中数据是唯一的,排序的。如果你单方面改动一个元素,那么这个唯一性和排序性就可能被破坏。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式