求教一下,关于for_each()的使用,对成员函数的调用问题

时间:2022-10-30 05:03:19
最近接触到for_each(),觉得终于可以摆脱for(vector<>::const_iterator.........)这恶心的语法了,感觉很愉快,但是在关于成员函数调用上遇到了麻烦。。。
具体地说,我想实现这个东西:
string s="abcdefg";
vector<int> vec;
for(iter=s.begin();......)
{
   vec.push_back(*iter);
}

但是用for_each如何实现?
在网上查了很久,发现最接近的一种方法是
for_each(s.begin(),s.end(),mem_fun_ref(&vector<int>::push_back));
但是mem_fun_ref部分的成员函数必须属于string s,而不能属于vector<int> vec,请问我该怎么处理啊。。。

10 个解决方案

#1


不需要,研究一下copy。

#2


顺便再问一下各位大神哈,怎么用for_each()输出vector<int> vec里的各个元素?

#3


还是用C++2011标准的range base for吧
for (auto x : s)
{
    ...
}

#4


引用 1 楼  的回复:
不需要,研究一下copy。


哦,好像这也行。。
不过其实我的意思是push_back(*iter-'0')...先copy再修改影响效率嘛,而且我是要用逆向迭代器反向录入的。。

另外就是如果以后有for_each(a.begin(),a.end(),f)而f是b的成员函数,这怎么处理啊。。

#5


打住吧,你会在stl的functor adaptor上被折腾到不是恶心,而是蛋碎的。
然后,你就会引入boost库,然后就麻烦更加大。


引用 4 楼  的回复:
另外就是如果以后有for_each(a.begin(),a.end(),f)而f是b的成员函数,这怎么处理啊。。

#6


引用 5 楼  的回复:
打住吧,你会在stl的functor adaptor上被折腾到不是恶心,而是蛋碎的。
然后,你就会引入boost库,然后就麻烦更加大。


引用 4 楼  的回复:
另外就是如果以后有for_each(a.begin(),a.end(),f)而f是b的成员函数,这怎么处理啊。。


这一点从我在网上看的文章上已经深切的体现出来了。。。

#7


楼主的vector<int> vec;这句应该是char型的吧。我给你写了如下代码,希望对你有用。
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
void func(char &a)
{
      cout<<a;
     }
int main(){ 
char* cptr="abcdefg";
vector<char> vec;//这里是char 
while(*cptr!='\0')//楼主想实现的功能在这里 
 {
   vec.push_back(*cptr);
   cptr++;
 }
 for_each(vec.begin(),vec.end(),func);//对于foreach的用法。 
 system("pause");
 return 0;
}

#8


如果是 C++ 11的话,


std::for_each(vec.begin(), vec.end(), [](int& i){
    printf("%d\n", i); //也可以对i赋值
});



填一个只有一个int参数的函数就可以了.

或者

for (auto& i : vec){
   //输出i 或者 对i 赋值
}

#9


for_each(s.begin(); s.end(); [&vec](char c)
{
    vec.push_back(c);
});

#10


引用 7 楼  的回复:
楼主的vector<int> vec;这句应该是char型的吧。我给你写了如下代码,希望对你有用。

C/C++ code
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
void func(char &amp;a)
{
      cout<<a;
     }
int ……

辛苦了,不过我不是这个意思啊,我就是需要调用类成员函数,尽量避免使用全局函数和友元函数啊。。
还有我的vector<int>确实是int,push_back()自带隐式类型转换的。

关于8L9L,c++11确实强大,不过我出于某种原因暂时不能使用。。。。

#1


不需要,研究一下copy。

#2


顺便再问一下各位大神哈,怎么用for_each()输出vector<int> vec里的各个元素?

#3


还是用C++2011标准的range base for吧
for (auto x : s)
{
    ...
}

#4


引用 1 楼  的回复:
不需要,研究一下copy。


哦,好像这也行。。
不过其实我的意思是push_back(*iter-'0')...先copy再修改影响效率嘛,而且我是要用逆向迭代器反向录入的。。

另外就是如果以后有for_each(a.begin(),a.end(),f)而f是b的成员函数,这怎么处理啊。。

#5


打住吧,你会在stl的functor adaptor上被折腾到不是恶心,而是蛋碎的。
然后,你就会引入boost库,然后就麻烦更加大。


引用 4 楼  的回复:
另外就是如果以后有for_each(a.begin(),a.end(),f)而f是b的成员函数,这怎么处理啊。。

#6


引用 5 楼  的回复:
打住吧,你会在stl的functor adaptor上被折腾到不是恶心,而是蛋碎的。
然后,你就会引入boost库,然后就麻烦更加大。


引用 4 楼  的回复:
另外就是如果以后有for_each(a.begin(),a.end(),f)而f是b的成员函数,这怎么处理啊。。


这一点从我在网上看的文章上已经深切的体现出来了。。。

#7


楼主的vector<int> vec;这句应该是char型的吧。我给你写了如下代码,希望对你有用。
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
void func(char &a)
{
      cout<<a;
     }
int main(){ 
char* cptr="abcdefg";
vector<char> vec;//这里是char 
while(*cptr!='\0')//楼主想实现的功能在这里 
 {
   vec.push_back(*cptr);
   cptr++;
 }
 for_each(vec.begin(),vec.end(),func);//对于foreach的用法。 
 system("pause");
 return 0;
}

#8


如果是 C++ 11的话,


std::for_each(vec.begin(), vec.end(), [](int& i){
    printf("%d\n", i); //也可以对i赋值
});



填一个只有一个int参数的函数就可以了.

或者

for (auto& i : vec){
   //输出i 或者 对i 赋值
}

#9


for_each(s.begin(); s.end(); [&vec](char c)
{
    vec.push_back(c);
});

#10


引用 7 楼  的回复:
楼主的vector<int> vec;这句应该是char型的吧。我给你写了如下代码,希望对你有用。

C/C++ code
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
void func(char &amp;a)
{
      cout<<a;
     }
int ……

辛苦了,不过我不是这个意思啊,我就是需要调用类成员函数,尽量避免使用全局函数和友元函数啊。。
还有我的vector<int>确实是int,push_back()自带隐式类型转换的。

关于8L9L,c++11确实强大,不过我出于某种原因暂时不能使用。。。。