2016-12-31 86 views
0

我想對包含int iterator的矢量vec進行排序,指向另一個向量int_vec中的元素。我想用下面的比較功能:IT1 < IT2當且僅當用std :: sort排序迭代器

index[it1 - int_vec.begin()] < index[it2 - int_vec.begin()]. 

如果指數是第三向量指定迭代器的關鍵。現在向量索引是A和INT_VEC的構造函數的內部數組是一類答:我想只是傳遞這樣一個匿名函數的成員變量:

std::sort(vec.begin(),flow.end(), [&index,&edges](const int_iter it1 ,const int_iter it2) -> bool 
{ 
    index[it1 - int_vec.begin()] < index[it2 - int_vec.begin()]; 
}) 

,但我得到一個錯誤,告訴我,成員對象不能被捕獲。確切的錯誤信息是:

'this' cannot be implicitly captured in this context 
     index[it1 - int_vec.begin()] < index[it2 - int_vec.begin()];. 

我也試着只需要聲明一個外部比較功能,但它不是我清楚我怎麼可以綁定兩個固定值,它(我讀到的boost ::綁定,它看起來像解決正是這個,但我寧願不下載額外的庫)。

+5

*我想排序包含指向另一個向量中的元素INT迭代器向量VEC INT_VEC * - 就在這個孤單是一個糟糕的主意,因爲矢量迭代器,如果無效矢量調整大小。 – PaulMcKenzie

+0

但矢量不會調整大小 – user3726947

+1

爲什麼它是一個向量呢?使用'std :: array'。 – user3684240

回答

3

那裏有很多問題。

  1. 最明顯的是你的代碼缺少[this]

  2. vec.begin(),flow.end()

你不能拿一個的開始和另一個向量的結束。

這是糾正代碼:

std::sort(vec.begin(),vec.end(), [this,&index,&edges](const int_iter it1 ,const int_iter it2) -> bool 
{ 
    index[it1 - int_vec.begin()] < index[it2 - int_vec.begin()]; 
}) 

但是,你應該告訴我們你想怎麼實現,我相信我們能找到一個更好的解決方案。使用其他矢量迭代器的矢量已經非常危險,對它們進行減法而不檢查是不小心的。

危險性較低的解決方案:

std::vector<int> int_vec; 
std::vector<size_t> int_vec_order(int_vec.size()); 
std::iota(int_vec_order.begin(), int_vec_order.end(), size_t(0)); 

std::sort(int_vec_order.begin(), int_vec_order.end(), [&int_vec](const size_t a, const size_t b) { 
    // apply your order to int_vec.at(a) and int_vec.at(b) 
}); 

// output them 
for(const size_t i : int_vec_order) { 
    // output int_vec.at(i) 
} 
+0

哦,流動的東西是一個錯字。所以這是有點彌補。實際上,int_vec不存儲int,但結構很安靜,我不想複製它們,這就是爲什麼我使用迭代器。也許這樣說會更好。我想要做以下事情:我在int_vec中以預定義順序存儲一些對象,然後在其中存儲一些其他對象。然後我排序int_vec(按一些不重要的順序)。現在我想以預定義的順序打印對象(但不包括int_vec中的其他對象)。 – user3726947

+0

編輯了答案。您始終可以使用危險性較低的索引。 – user3684240

+0

@ user3726947解決方案是使用索引,而不是迭代器。 [看到這個答案](http://stackoverflow.com/questions/40405266/having-trouble-creating-an-array-that-shows-how-the-indices-were-moved-in-anothe/40405691#40405691) – PaulMcKenzie