簡體   English   中英

使用另一個向量中的值對矢量進行排序

[英]Sorting a vector using values in another vector

我有一個名為foo_vecstd::vector foo_vec包含類Foo對象。 假設Foo有一個成員變量int x ,我還實現了一個函數CompareInts(int a, int b) ,它返回ab的最小值。 然后,我可以根據對象的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM