[英]Sorting a vector using values in another vector
我有一個名為foo_vec
的std::vector
foo_vec
包含類Foo
對象。 假設Foo
有一個成員變量int x
,我還實現了一個函數CompareInts(int a, int b)
,它返回a
和b
的最小值。 然后,我可以根據對象的x
值對std::sort
。
但是,如果這些x
值不是Foo
成員變量,而是在另一個名為x_vec
std::vector
。 這里,第一元件x_vec
對應於第一元件foo_vec
,依此類推。 如何根據foo_vec
中的相應值在x_vec
上執行std::sort
?
您可以制作第三個索引向量並間接排序。 排序后,您可以通過排序索引訪問原始向量:
std::vector<Foo> foo_vec = /* ... */;
std::vector<int> x_vec = /* ... */;
std::vector<std::size_t> index_vec;
assert(foo_vec.size() == x_vec.size());
for (std::size_t i = 0; i != foo_vec.size(); ++i) { index_vec.push_back(i); }
std::sort(
index_vec.begin(), index_vec.end(),
[&](std::size_t a, std::size_t b) { return x_vec[a] < x_vec[b]; });
for (std::size_t i = 0; i != index_vec.size(); ++i)
{
std::cout << "Sorted element " << i << " is "
<< foo_vec[index_vec[i]] << "\n";
}
請注意,此操作完全是非侵入性的,因為一切都是間接發生的。
您創建int的第三個向量,它是原始兩個向量的索引。 最初用數字0填充第三個向量。向量的長度。 然后構造比較函數以從第三個向量中獲取索引,然后對持有鍵的第二個向量進行比較。
第一個和第二個向量中的數據不會被修改(這是好的),第三個向量中的值將表示一旦完成的排序順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.