【问题标题】:C++ search vector for MAX, and get same position form a second vectorMAX的C++搜索向量,并从第二个向量中获得相同的位置
【发布时间】:2013-01-20 21:01:01
【问题描述】:

我正在使用 C++,并且我有 2 个彼此相关的向量:

vector<double> val = {.3,.5,.2,.4};
vector<string> str = {'a','b','c','d'};

我想在 val 中搜索最大值,然后从 str 中的相同位置返回字符串:

vector<double>::const_iterator it;
it = max_element(val.begin(), val.end());

那么,我如何在str 中使用it 来获取这封信?

string lettter;
letter = str.at(it-> ????? );

谢谢!!!

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    您可以找出itval 开头的距离,然后用它来索引str

    str[std::distance(std::begin(val), it)]
    

    通过使用std::distance,如果您将val 的类型更改为迭代器不提供随机访问的容器,这仍然有效。但是,在随机访问迭代器上使用它时,您仍然会获得恒定的时间复杂度。如果您愿意,使用std::begin 可以将val 更改为C 样式的数组。

    值得一提的是,您应该使用以下命令初始化 str

    vector<string> str = {"a","b","c","d"};
    

    std::string 没有采用char 的构造函数。

    【讨论】:

    • 我看到一个错误,上面写着“没有函数模板的实例 std::distance 与参数列表匹配” ------ 我试过 str[std::distance(std::begin(val), *it)] 同样的事情
    • @Special--k 我认为您的问题是itconst_iteratorstd::begin 给出了iterator。不幸的是,没有std::cbegin(标准中的疏忽)。您可以将it 设置为iterator 或自己实现cbegin。或者你可以只使用val.cbegin() 而不是std::begin(val)
    【解决方案2】:

    怎么样

    letter = str.at(it - val.begin());
    

    ?

    (Rationale)

    【讨论】:

    • 我认为std::distance 稍微好一点,因为它可以与列表和其他容器一起使用。您链接的基本原理在这里并不适用,因为max_element 已经是 O(n),因此添加另一个可能的 O(n) 操作并不重要。
    • 很多好的答案,我最终选择了 distance() 答案。所以对这个答案点头似乎是公平的。希望我能接受 2 :)
    【解决方案3】:

    这将为您提供max_element() 返回的迭代器与向量开头之间的距离:

    std::distance(val.begin(), it)

    然后您可以将其用作str 的索引。

    【讨论】:

      【解决方案4】:

      像这样获取元素的索引:

      auto index = std::distance(val.begin(), it);
      

      然后索引到你的字符串数组:

      auto letter = str[index];
      

      请注意,如果这些值是相关的,您可能应该强制将它们放在一起:

      typedef std::pair<double, string> valstr_pair;
      std::vector<valstr_pair> valstr;
      
      auto it = std::max_element(valstr.begin(), valstr.end(),
          [](const valstr_pair& first, const valstr_pair& second)
          {
              return first.first < second.first; // compare values
          });
      
      it->first;  // max value
      it->second; // string of max value
      

      【讨论】:

      • 这是个好主意,但我会使用地图。问题是我的向量在我的应用程序中的不同时间被填满。这在我上面的简单示例中并不明显。所以,我不能将这些值放在一起,因为在将字符串(文件名)插入到它们的向量中时,双打(得分函数)还没有运行。我想我可以插入全 0 的文件名,然后在计算分数后更新它们。
      猜你喜欢
      • 2015-06-30
      • 2021-04-28
      • 2014-03-25
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多