我有一個包含某類實體的向量,比方說std::vector<A> a。我想根據存盤在std::vector<float> weights中的權重對這個向量進行排序,其中weights[i]是與a[i]相關的權重;在排序之后,a元素必須按照權重的增加來排序。
我知道如何明確地做到這一點,但是我想使用C 14 STL演算法,以便從最終的最佳實作中獲益。到目前為止,我還沒有弄清楚如何在std::sort的lambda比較運算式中使用weights,也沒有弄清楚如何在每次a的兩個元素被std::sort交換時保持a和weights對齊,所以我開始認為這可能不可能。
預先感謝任何幫助。
uj5u.com熱心網友回復:
對一個索引向量進行排序,然后根據結果重新排列:
void my_sort(std: :vector<A>& a, std::vector<float>& weights)
{
std::vector<int> idx(a.size())。
std::iota(idx.begin(), idx.end(), 0) 。
sort(idx.begin(), idx.end() 。
[&](int a, int b) { return weights[a] < weights[b]; }) 。
auto reorder = [&](const auto& o) {
decltype(o) n(o.size()。
std::transform(idx.begin(), idx.end(), n.begin() 。
[&](int i) { return o[i]; }) 。
return n;
};
a = reorder(a)。
weights = reorder(weights)。
}
uj5u.com熱心網友回復:
- 在std::pair<A,float>向量中轉換兩個向量,然后根據權重(pair的第二個成員)排序。之后再重新創建這兩個向量 。
- 在A類中添加一個新成員,使其包含權重并基于該權重進行排序 。
- 基于一個包含權重的全域陣列制作一個自定義的比較函式,就像這里描述的那樣。std::sort and custom swap function
我會選擇3,因為它是最有效的。如果你沒有多執行緒,這也是有效的,因為多執行緒需要一些同步。
uj5u.com熱心網友回復:
我的評論正好暗指@AndreaRossini的評論所總結的內容。就像這樣:
#include <boost/hana/functional/on.hpp>
#include <functional>/span>
#include <iostream>
#include <range/v3/algorithm/sort.hpp>
#include <range/v3/view/transform.hpp>/span>
#include <range/v3/view/zip.hpp>/span>
#include <string>
#include <vector>
使用 boost::hana::on。
using namespace ranges;
using namespace ranges::views;
//helpers to get first and second of a pair[/span]。
auto /*C 17->*/constexpr/*< -C 17*/ fst = [](auto const& p){ return p。 first; };
auto /*C 17->*/constexpr/*< -C 17*/ snd = [](auto const& p){ return p。 second; };
int main(){
std::vector<std::string> v{"one", "two", "three"}; // values.
std::vector<float> w{3,1,2}; //weight
// zipping 這兩個序列;vw的每個元素都是一對。
auto vw = zip(v, w)。
//sorting: using `std::less` on the `snd` element of the pairs。
sort(vw, std::less<>{} ^on^ snd)。
//只提取每一對中的`fst`。
auto res = vw | transform(fst)。
//顯示結果。
for (auto i : res) { std::cout << i << std::endl; }
關于我所使用的庫的一些情況:
res不是一個std::vector,而只是一個view;如果你想要一個向量,你可以做#include <range/v3/range/conversion.hpp>/span> auto res = vw | transform(fst) | to_vector;std::less<>{}。^on^ snd等同于下面的f。所以你可以把它看作是一個函式,它接收auto f = [](auto const& x, auto const& y){ return std::less<>{}(snd(x), snd(y)); };x和y并回傳snd(x) < snd(y)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/331861.html
標籤:
