如何对向量使用查找算法

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:这个问题没有提到 lowestminimum 之类的。我的代码搜索特定值,我将1 作为问题示例中的值。但是你可以使用match_first&lt;int&gt;(4)match_first&lt;int&gt;(28)match_first&lt;int&gt;(-212) 甚至match_first&lt;int&gt;(totally_unknown) 就好了 对除 match_first(totally_unknown) 之外的所有内容都为真。你找不到你不知道要找的东西。 好吧,我猜你不是在开玩笑。愿你快乐地找到所有你能找到的最低价值。 其实,如果你想成为 generic… template&lt;class K&gt; struct match_first_type K k; match_first_type(K k) : k(k) template&lt;class T&gt; bool operator()(T const &amp;x) return x.first == k; ; template&lt;class K&gt; match_first_type&lt;K&gt; 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,我假设“第一个元素”是指 pair::first not v[0] 实际上,在 0x 中我会写:for (auto &amp;x : v) if (x.first == 1) do_stuff_with(x); /*break if you only want to find the first instead of all*/ 【参考方案3】:

为什么不使用multimap&lt;int, double&gt; 而不是vector?它的.find(1) 将产生一个迭代器,该迭代器将给出pair&lt;int, double&gt;(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...

以上是关于如何对向量使用查找算法的主要内容,如果未能解决你的问题,请参考以下文章

使用 STL 算法在表(向量的向量、二维数组)中查找最小值/最大值的优雅方法

查找向量中的最小项目列表

排序算法

java 二分查找 - 折半查找算法

二分查找(折半查找)算法详解(C语言实现)

带你快速记住二分查找算法