【问题标题】: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. 一个任意值作为该对的第一个成员的值。正如您在下面看到的,解决方案大相径庭。另外,如果向量已经排好序了,那么开始迭代器有什么问题?

标签: c++ vector find


【解决方案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...
    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多