【问题标题】:C++ retrieving an index value in a vector while using min_element or max_elementC++ 在使用 min_element 或 max_element 时检索向量中的索引值
【发布时间】:2018-05-25 18:29:47
【问题描述】:

我正在处理一个问题,我的代码中有两个向量对象:一个是vector<string>,另一个是vector<unsigned>,我将其作为常量引用传递给某个函数。我正在使用这些函数从一个向量中找到最小值或最大值,但我需要最小值或最大值的索引值,以便我可以索引到另一个向量。我的代码如下所示:

std::string getTopEmployee( const std::vector<std::string>& names, const std::vector<unsigned>& ratings ) {
    // Find Largest Value in ratings
    std::size_t largest = *std::max_element( ratings.begin(), ratings.end() );
    // How to get the index?
    // I do not need the largest value itself.

    return names[index];
}

std::string getWorstEmployee( const std::vector<std::string>& names, const std::vector<unsigned>& ratings ) {

   // Find Smallest Value in ratings
   std::size_t smallest = *std::min_element( ratings.begin(), ratings.end() );
    // How to get the index?
    // I do not need the smallest value itself.

    return names[index];
}

传入此函数的两个向量大小相同:我们假设ratings 向量中没有两个值相等。对第二个向量进行排序不是一种选择。

【问题讨论】:

  • 提示:std::min_elementstd::max_element 返回什么值?你不是在使用它们,而是在取消引用它们。
  • @PaulMcKenzie 没有取消引用它们,它们返回一个指针或迭代器。
  • 好的,那么对那个指针和容器的开始做数学运算。
  • @PaulMcKenzie 那是我有点迷路了......在这里摇头;它也应该很简单。
  • @FrancisCugler 您的来电,但请接听。

标签: c++ vector indexing max min


【解决方案1】:

std::min_element()std::max_element() 使用迭代器,而不是索引。

对于像std::vector 这样的可索引容器,您可以使用std::distance() 将迭代器转换为索引,例如:

std::string getTopEmployee( const std::vector<std::string>& names, const std::vector<unsigned>& ratings ) {
    // Find Largest Value in ratings
    auto largest = std::max_element( ratings.begin(), ratings.end() );
    if (largest == ratings.end()) return "";
    return names[std::distance(ratings.begin(), largest)];
}

std::string getWorstEmployee( const std::vector<std::string>& names, const std::vector<unsigned>& ratings ) {
    // Find Smallest Value in ratings
    auto smallest = std::min_element( ratings.begin(), ratings.end() );
    if (smallest == ratings.end()) return "";
    return names[std::distance(ratings.begin(), smallest)];
}

【讨论】:

  • 我尝试使用它,代码似乎适用于第一个函数来查找最大值并返回正确的字符串。但是,由于某种原因,第二个函数返回一个空字符串,我不知道为什么。我正在使用相同的两个向量连续传递给这两个函数。
  • 好的,我发现了我的问题。在其他一些地方,我的向量的大小在填充之前用 X 个元素调整大小,并且只有 Y 个有效元素可以处理 Y
  • 谢谢你们的帮助。我知道这很简单,但让编码器阻塞......
【解决方案2】:

对于std::vector 或任何其他带有random-access iterators 的容器,您可以使用算术运算符(为简单起见,我们假设容器不为空):

 auto maxi = std::max_element(ratings.begin(), ratings.end());
 return names[maxi - ratings.begin()];

复杂度:O(1).

对于迭代器至少为input iterators 的容器,您可以使用std::distance

 auto maxi = std::max_element(ratings.begin(), ratings.end());
 return names[std::distance(ratings.begin(), maxi)];

复杂性:O(1) 使用随机访问迭代器,O(n) 没有随机访问。

【讨论】:

  • 感谢您的帮助;雷米比你早一点。我知道随机访问和迭代容器之间的区别以及它们的时间复杂度。我只是在想一些简单的事情......我只是遇到了一个编码器阻塞的情况......
  • 只要确保容器不为空,或者至少处理算法返回 end 迭代器的情况,否则您将结束访问不存在的索引 0。
  • @RemyLebeau,你是对的,谢谢。我将添加关于空容器的评论。
  • 我不得不接受雷米的回答,因为他是第一个回答的人,这为我指明了解决问题的正确方向。您的回答还为可能阅读本文的其他人提供了有关不同容器时间复杂度的绝佳见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2021-06-16
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多