
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处都编译不通过,点解? 展开
#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处都编译不通过,点解? 展开
2个回答
展开全部
上面这个仁兄的解释可圈可点,但是有些东西解释的还是误导了你。
首先,你这个程序中只是声明了一个常量迭代器,而并没有使用它,所以这对你的程序并没有不良影响(就此例而言)。
其次,这个程序的问题在于 set<int,greater<int>> se; 因为你没有将<int>>此处的两个 > 用空格分开,所以编译器会当作一个输入流操作符使用,于此例当然编译通不过。所以你只需这样即可:set<int,greater<int> > se;
你这是在看C++标准程序库吧,一定要仔细看哦,有很多细节都有解释,比如你的这个问题。
希望对你有帮助。
首先,你这个程序中只是声明了一个常量迭代器,而并没有使用它,所以这对你的程序并没有不良影响(就此例而言)。
其次,这个程序的问题在于 set<int,greater<int>> se; 因为你没有将<int>>此处的两个 > 用空格分开,所以编译器会当作一个输入流操作符使用,于此例当然编译通不过。所以你只需这样即可:set<int,greater<int> > se;
你这是在看C++标准程序库吧,一定要仔细看哦,有很多细节都有解释,比如你的这个问题。
希望对你有帮助。
展开全部
这并不是transform函数的问题,如果你用vector来做这个transform 那将没有问题
但很不幸的是,set的iterator是不能用来修改的(也就是所谓的Immutable的)
这点你可以用以下代码确认:
set<int> s;
set<int>::iterator i = s.begin();
*i = 1;
以上代码是不能通过编译的,道理和你上面的代码一样,因为*i返回的是const int&,所以不能修改。
set不能修改的原因也很简单,因为set的实现需要维护集合中数据是唯一的,排序的。如果你单方面改动一个元素,那么这个唯一性和排序性就可能被破坏。
但很不幸的是,set的iterator是不能用来修改的(也就是所谓的Immutable的)
这点你可以用以下代码确认:
set<int> s;
set<int>::iterator i = s.begin();
*i = 1;
以上代码是不能通过编译的,道理和你上面的代码一样,因为*i返回的是const int&,所以不能修改。
set不能修改的原因也很简单,因为set的实现需要维护集合中数据是唯一的,排序的。如果你单方面改动一个元素,那么这个唯一性和排序性就可能被破坏。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询