有INT V1和V2,其中V1包含V2C++的std ::變換替代由指數
v1: 8 12 4 17
v2: 6 4 14 17 9 0 5 12 8
的一個子集2個未分類的載體有什麼辦法,如何通過更換V1的項目的項目其在v2中的位置的指數?
v1: 8 7 1 3
這是沒有寫這樣使用2個週期的算法問題...
但有使用使用std ::變換的任何解決方案?
有INT V1和V2,其中V1包含V2C++的std ::變換替代由指數
v1: 8 12 4 17
v2: 6 4 14 17 9 0 5 12 8
的一個子集2個未分類的載體有什麼辦法,如何通過更換V1的項目的項目其在v2中的位置的指數?
v1: 8 7 1 3
這是沒有寫這樣使用2個週期的算法問題...
但有使用使用std ::變換的任何解決方案?
結合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;
}
輸出:
$ g++ -std=c++0x test.cpp
$ ./a.out
v1: 8 7 1 3
你可以使用std::find()
在轉型:
std::transform(v1.begin(), v1.end(), v1.begin(), [&](int v)->int {
return std::find(v2.begin(), v2.end(), v) - v2.begin());
});
std::transform
花費一元 - 功能 - 李KE-對象。因此,您可以創建一個函子類來高效地執行此操作,並使用第二個向量構造它,然後將該函子應用於第一個向量。
template <typename T>
class IndexSeeker{
private:
map<T, int> indexes;
public:
IndexSeeker(vector<T> source){
for(int k = 0; k < t.size(); ++k){
indexes[source[k]] = k;
}
}
int operator()(const T& locateme){
if(indexes.find(T) != indexes.end()){
return indexes[T];
}
return -1;
}
}
通過將整個第二列表緩存到映射中,查找索引是有效的,而不是需要線性搜索。這要求類型T是可排序的(並且因此可映射)。如果T不可排序,則需要進行蠻力搜索的效率較低的方法。
@ Jared Hoberock:謝謝,我可以請求沒有lambda表達式的結果嗎?我沒有任何經驗...... – justik 2012-01-28 00:10:23
@justik:這只是一個奇特的C++ 11創建函數對象的方法。因此,只需將該函數的類型作爲其operator'()'。作爲構造函數參數和類成員引用'std :: Vector'的對象。 –
2012-01-28 00:17:32
@justik:我已經更新了示例以提供一個省略了lambda函數的C++ 03解決方案。 – 2012-01-28 00:22:39