我有一个发现的WiFi网络的vecor list。问题是,即使它们具有相同的名称(中继器),它也会检测到所有发射机。我想删除重复项,但保留最高质量(RSSI)的重复项。

Example:
{HomeWiFi, -60}
{HomeWiFi, -55}
{HomeWifi, -80}    //Worse signal, duplicate name = repeater further away
{AnotherWifi, -70}

Expected output:
{HomeWiFi, -55}
{AnotherWifi, -70}

我当时想按名称对它们进行排序,然后使用std::unique删除连续的重复项,但是我不知道如何按质量指定“第二”排序。

struct WiFiParam
{
    String SSID;
    int32_t RSSI;
    .....
};

std::vector<WiFiParam> list;

最佳答案

使用自定义函子,您可以执行以下操作:

std::vector<WiFiParam> params /*= */;

auto less_by_name_signal = [](const WiFiParam& lhs, const WiFiParam& rhs){
    return std::tie(lhs.SSID, rhs.RSSI) < std::tie(rhs.SSID, lhs.RSSI);
};
std::sort(params.begin(), params.end(), less_by_name_signal);
auto equal_by_name = [](const WiFiParam& lhs, const WiFiParam& rhs){
    return lhs.SSID == rhs.SSID;
};
params.erase(std::unique(params.begin(), params.end(), equal_by_name), params.end());

Demo

10-01 11:44