优雅高效的算法,用于增加"vector<pair>"值

Elegant and efficient algorithm for increasing values of a "vector<pair>"

本文关键字:vector lt pair gt 增加 高效 算法 用于      更新时间:2023-10-16

我需要在vector<pair<int, float>>中找到一个元素并增加第二个值。我尝试了一种方法。

template <typename K, typename V>
struct match_first {
    const K _k; match_first(const K& k) : _k(k) {}
    bool operator()(const pair<K, V>& el) const {
        return _k == el.first;
    }
};

例如使用:

vector< pair<int, float> > vec;
vec.push_back(make_pair(2, 3.0));
vec.push_back(make_pair(3, 5.0));
vec.push_back(make_pair(1, 1.0));
vector< pair<int, float> >::iterator it = find_if(vec.begin(), vec.end(), match_first<int, float>(3));
if (it != vec.end()) {
    it->second += 9;
}

有没有更有效的方法来完成这项任务?

地图看起来更自然:

#include <map>
int main()
{
    std::map<int, float> m;
    m.insert(std::make_pair(2, 3.0));
    m.insert(std::make_pair(3, 5.0));
    m.insert(std::make_pair(1, 1.0));
    auto it = m.find(3);
    if (it != m.end()) {
        it->second += 9;
    }
}

它也会更快,因为查找是O(log(n))

您可以使用排序对的向量达到相同的复杂性 std::lower_bound (或std::equal_range如果键可以重复)

这取决于您的约束。如果您有唯一键(第一个元素),则可以使用 std::map<K,V> 来保存对象。然后增加它很容易。如果V有一个默认构造函数将其初始化为零,您甚至可以跳过添加新元素而只是递增(我不确定它是否适用于整数)。

std::map<K,V> data;
data[key] = data[key] + 1;

用于不存在的键的 [] 运算符将使用其默认构造函数为您创建对象。要仅访问数据,请使用atfind方法。

扩展了sehe的答案:如果您有重复的键,则可以以相同的方式使用std::multimap。这个容器还使<K,V>对保持排序顺序(键),因此二叉搜索方法显然加快了速度。

您的问题没有确切的答案:这取决于。

我的第一个答案是:使用std::find_if(在<algorithm>中可用,这是C++标准库的一部分),然后分析你的代码。如果搜索被证明是一个值得关注的瓶颈,那么尝试另一种方法。

当心使用 std::map ,因为它将按它们的第一个组件对进行排序(也就是说,广告顺序将丢失)。此外,它不允许您将存储具有相同第一个组件的两对。

正如其他人所提到的,你可以解决这个警告(如果它们确实是你的问题的警告),但是,就像我之前提到的,只有当你首先证明搜索是使用标准算法后的瓶颈时,你才值得花时间。