我有一个整数向量,我想将它转换为对的向量(对由bool和int组成).我目前的代码很简单:
std::vector<int> a;
std::vector<std::pair<bool,int> > b;
a.push_back(1);
a.push_back(2);
a.push_back(3);
for(int i = 0; i < a.size(); ++i)
{
b.push_back(std::make_pair(false, a[i]));
}
Run Code Online (Sandbox Code Playgroud)
如果不自己编写循环,有没有办法做到这一点?可能使用一些算法?
Eva*_*ran 16
1.你可以做一个函子和std::for_each
:
struct F {
F(std::vector<std::pair<bool,int> > &b) : m_b(b){
}
void operator()(int x) {
m_b.push_back(std::make_pair(false, x));
}
std::vector<std::pair<bool,int> > &m_b;
};
std::for_each(a.begin(), a.end(), F(b));
Run Code Online (Sandbox Code Playgroud)
虽然这可能比它的价值更麻烦.但至少它可以重复使用:).
也许有一些事情可以做boost::bind
.
2.编辑:我当时认为你可以使用绑定后插入器和转换.这样的事情:
std::transform(a.begin(), a.end(), std::back_inserter(b), boost::bind(std::make_pair<bool, int>, false, _1));
Run Code Online (Sandbox Code Playgroud)
我试过这个std::bind1st
,我认为它应该有效,但我只能让它成功boost::bind
.我会继续努力......
3.编辑:这是一个非增强的解决方案:
std::transform(a.begin(), a.end(), std::back_inserter(b), std::bind1st(std::ptr_fun(std::make_pair<bool, int>), false));
Run Code Online (Sandbox Code Playgroud)
4.编辑:这是一个C++ 11解决方案(这是我目前最喜欢的):
std::for_each(begin(a), end(a), [&b](int v) {
b.push_back(std::make_pair(false, v));
});
Run Code Online (Sandbox Code Playgroud)
甚至更简单:
for(int v : a) {
b.push_back(std::make_pair(false, v));
}
Run Code Online (Sandbox Code Playgroud)