jus*_*tik 2 c++ replace transform vector indices
int v1和v2有2个未排序的向量,其中v1包含v2的子集
v1: 8 12 4 17
v2: 6 4 14 17 9 0 5 12 8
Run Code Online (Sandbox Code Playgroud)
有没有办法,如何用v2中的位置索引替换v1的项目?
v1: 8 7 1 3
Run Code Online (Sandbox Code Playgroud)
用循环编写这样的算法是没有问题的......
但有没有使用std :: transform的解决方案?
std::transform与调用std::find以下函数的函数对象组合:
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
struct find_functor
{
std::vector<int> &haystack;
find_functor(std::vector<int> &haystack)
: haystack(haystack)
{}
int operator()(int needle)
{
return std::find(haystack.begin(), haystack.end(), needle) - haystack.begin();
}
};
int main()
{
std::vector<int> v1 = {8, 12, 4, 17};
std::vector<int> v2 = {6, 4, 14, 17, 9, 0, 5, 12, 8};
// in c++11:
std::transform(v1.begin(), v1.end(), v1.begin(), [&v2](int x){
return std::find(v2.begin(), v2.end(), x) - v2.begin();
});
// in c++03:
std::transform(v1.begin(), v1.end(), v1.begin(), find_functor(v2));
std::cout << "v1: ";
std::copy(v1.begin(), v1.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ g++ -std=c++0x test.cpp
$ ./a.out
v1: 8 7 1 3
Run Code Online (Sandbox Code Playgroud)