我尝试使用map
将vector
的值复制到std::transform
。在this回答之后,我设法做到了。在寻找方法时,我了解了select2nd
。所以我尝试使用std::bind
实现“类似select2nd”的操作。但是,在定义select2nd
别名时,我得到:
test.cpp:9:19: error: expected type-specifier
using select2nd = std::bind(&T::value_type::second, std::placeholders::_1);
^
test.cpp: In function ‘int main()’:
test.cpp:29:64: error: ‘select2nd’ was not declared in this scope
std::transform(m.begin(), m.end(), std::back_inserter(v2), select2nd);
这是我提出的片段:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <functional>
#include <map>
#include <vector>
template <typename T>
using select2nd = std::bind(&T::value_type::second, std::placeholders::_1);
using std::placeholders::_1;
void printn(int i) {
std::cout << i << " ";
}
int main() {
std::map<int, int> m;
std::vector<int> v1, v2;
for (auto &i : { 0, 1, 2, 3, 4 }) {
m[i] = rand();
}
// Works
std::transform(m.begin(), m.end(), std::back_inserter(v1),
std::bind(&std::map<int, int>::value_type::second, _1));
// Doesn't
std::transform(m.begin(), m.end(), std::back_inserter(v2), select2nd);
std::for_each(v1.begin(), v1.end(), std::bind(printn, _1));
std::cout << std::endl;
std::for_each(v2.begin(), v2.end(), std::bind(printn, _1));
std::cout << std::endl;
return 0;
}
为什么第一个transform
有效,而第二个?如何将别名参数化为std::bind
?
答案 0 :(得分:4)
这应该有效,但不是更好:
template <typename T>
decltype(std::bind(&T::value_type::second, std::placeholders::_1)) select2nd(T m) {
return std::bind(&T::value_type::second, std::placeholders::_1);
}
// ....
std::transform(m.begin(), m.end(), std::back_inserter(v2), select2nd(m));
// ....
这是另一种选择,不需要参数:
template <typename T>
decltype(std::bind(&T::value_type::second, std::placeholders::_1)) select2nd() {
return std::bind(&T::value_type::second, std::placeholders::_1);
}
你可以使用它:
std::transform(m.begin(), m.end(), std::back_inserter(v2),
select2nd<std::map<int, int>>());
或:
std::transform(m.begin(), m.end(), std::back_inserter(v2),
select2nd<decltype(m)>());