优雅高效的算法,用于增加"vector<pair>"值
Elegant and efficient algorithm for increasing values of a "vector<pair>"
我需要在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;
用于不存在的键的 []
运算符将使用其默认构造函数为您创建对象。要仅访问数据,请使用at
或find
方法。
扩展了sehe的答案:如果您有重复的键,则可以以相同的方式使用std::multimap
。这个容器还使<K,V>
对保持排序顺序(键),因此二叉搜索方法显然加快了速度。
您的问题没有确切的答案:这取决于。
我的第一个答案是:使用std::find_if
(在<algorithm>
中可用,这是C++标准库的一部分),然后分析你的代码。如果搜索被证明是一个值得关注的瓶颈,那么尝试另一种方法。
当心使用 std::map
,因为它将按它们的第一个组件对进行排序(也就是说,广告顺序将丢失)。此外,它不允许您将存储具有相同第一个组件的两对。
正如其他人所提到的,你可以解决这个警告(如果它们确实是你的问题的警告),但是,就像我之前提到的,只有当你首先证明搜索是使用标准算法后的瓶颈时,你才值得花时间。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 在某些循环内使用vector.push_back时出现分段错误
- 当vector是tje全局变量时,c++中vector的内存管理
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- std::vector的包装器,使数组的结构看起来像结构的数组
- 呼叫运营商<<临时
- 为什么(-1)%vector::size()总是返回0
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在C++中将类(带有Vector成员)保存为二进制文件
- 编译器如何区分std::vector的构造函数
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- std::vector::reserve(未知m),我知道m<<;N(通常)并且知道N
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- C++重载<<具有typedef'd std::vector
- std::映射<>或std::vector<>在处理大型标志集时