如何对向量使用查找算法
Posted
技术标签:
【中文标题】如何对向量使用查找算法【英文标题】:how to use find algorithm for a vector 【发布时间】:2011-05-06 22:59:07 【问题描述】:如果向量的元素是 pair 类型,如vector<pair<int, double>>
。我想让查找算法专注于我的向量的第一个元素。我该怎么做?
例如,以下是我的数据:
<1, 2>
<3, 5>
<3, 4>
...
我想要在第一列中找到 1。
谢谢,
【问题讨论】:
你需要澄清你的问题。您是否想要 1. 第一列中的最小值(即该对的第一个成员),2. 一个任意值作为该对的第一个成员的值。正如您在下面看到的,解决方案大相径庭。另外,如果向量已经排好序了,那么开始迭代器有什么问题? 【参考方案1】:不遗余力地做出答案通用:
template <typename K>
struct match_first
const K _k; match_first(const K& k) : _k(k)
template <typename V>
bool operator()(const std::pair<K, V>& el) const
return _k == el.first;
;
像这样使用它,例如
it = std::find_if(vec.begin(), vec.begin(), match_first<int>(1));
if (it!=vec.end())
// found
【讨论】:
如果第一个(最小/最小)键是 4... 或 28... 或 -212... 或完全未知? (我假设最低的键是第一个。) @Sani:这个问题没有提到 lowest 或 minimum 之类的。我的代码搜索特定值,我将1
作为问题示例中的值。但是你可以使用match_first<int>(4)
、match_first<int>(28)
、match_first<int>(-212)
甚至match_first<int>(totally_unknown)
就好了
对除 match_firsttemplate<class K> struct match_first_type K k; match_first_type(K k) : k(k) template<class T> bool operator()(T const &x) return x.first == k; ; template<class K> match_first_type<K> match_first(K k) return k;
用作 match_first(1) 而不必指定 int 作为模板参数。
【参考方案2】:
如果您使用较新的 C++ 编译器,您可以编写
int value_to_find = 1;
auto it = find_if( v.begin(), v.end(), [=]( const pair<int,double> &p ) return p.first == value_to_find; );
if ( it != v.end() )
// found!
【讨论】:
如果第一个(最小/最小)键的“值”未知?您假设第一个键始终为 1。它可能是 4、8、-212 或其他任何值... @Sani Huttunen,C++ lambda 语法中没有任何内容阻止使用变量。我只是指出这个例子是一种非常简洁的方式,它不需要实现整个类(或者更确切地说让编译器来做)。 大部分情况下都是正确的。但是,如果您不知道要查找的密钥的值,则此方法将不起作用。 @Sani Huttunen,我假设“第一个元素”是指 pairfor (auto &x : v) if (x.first == 1) do_stuff_with(x); /*break if you only want to find the first instead of all*/
【参考方案3】:
为什么不使用multimap<int, double>
而不是vector
?它的.find(1)
将产生一个迭代器,该迭代器将给出pair<int, double>(1,2)
对,如您的示例所示; http://www.sgi.com/tech/stl/Multimap.html
【讨论】:
【参考方案4】:无论语言/平台如何,这都是您需要做的(在伪代码中):
min = MAXIMUM_INTEGER_VALUE
minValue = 0
for each (element in vector)
if (element.key < min)
min = element.key
minValue = element.value
end if
loop for
现在您应该拥有最小的键,它的值分别以 min 和 minValue 为单位。 但是,在所有键都等于 MAXIMUM_INTEGER_VALUE 的极端情况下,您可能会得到错误的结果。解决方案是在初始化期间将第一个元素的值分配给 minValue 而不是 0。
【讨论】:
问题在哪里提到找到最小值?此外,鼓励实施新的排序/查找算法是......不好的建议 Nowhere... 这是我所做的假设... 由于键是 1、3、3,我假设示例键对于上述算法的工作方式并不重要。该算法应该根据示例找到最小的键值(假设)。 您确定他要查找特定的密钥吗?为什么不赞成使用通用的有效算法? 确实看过OP的问题,这个解决方案有一个案例,意图不明确。 OP 并没有具体说他正在寻找一个任意值,只是第一个值(无论这对 OP 意味着什么)。所以现在 +1...以上是关于如何对向量使用查找算法的主要内容,如果未能解决你的问题,请参考以下文章