2012-01-27 26 views
2

有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 ::變換的任何解決方案?

回答

5

結合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 
+0

@ Jared Hoberock:謝謝,我可以請求沒有lambda表達式的結果嗎?我沒有任何經驗...... – justik 2012-01-28 00:10:23

+0

@justik:這只是一個奇特的C++ 11創建函數對象的方法。因此,只需將該函數的類型作爲其operator'()'。作爲構造函數參數和類成員引用'std :: Vector '的對象。 – 2012-01-28 00:17:32

+0

@justik:我已經更新了示例以提供一個省略了lambda函數的C++ 03解決方案。 – 2012-01-28 00:22:39

0

你可以使用std::find()在轉型:

std::transform(v1.begin(), v1.end(), v1.begin(), [&](int v)->int { 
    return std::find(v2.begin(), v2.end(), v) - v2.begin()); 
}); 
0

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不可排序,則需要進行蠻力搜索的效率較低的方法。