C++在使用min_element或max_element时检索向量中的索引值

Fra*_*ler 2 c++ indexing vector max min

我正在处理一个问题,我的代码中有2个向量对象:1是vector<string>另一个vector<unsigned>我作为const ref传递给某个函数的东西.我正在使用这些函数来查找一个向量中的最小值或最大值,但我需要min或max的索引值,以便我可以索引到另一个向量.我的代码看起来像这样:

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];
}
Run Code Online (Sandbox Code Playgroud)

传递给这个函数的两个向量具有相同的大小:我们假设ratings向量中没有两个值相等的值.排序第二个向量不是一个选项.

Rem*_*eau 7

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)];
}
Run Code Online (Sandbox Code Playgroud)


DAl*_*Ale 7

对于std::vector或任何其他带有随机访问迭代器的容器,您可以使用算术运算符(为了简单起见,我们假设容器不是空的):

 auto maxi = std::max_element(ratings.begin(), ratings.end());
 return names[maxi - ratings.begin()];
Run Code Online (Sandbox Code Playgroud)

复杂度:O(1)

对于具有至少是输入迭代器的迭代器的容器,您可以使用std::distance

 auto maxi = std::max_element(ratings.begin(), ratings.end());
 return std::distance(ratings.begin(), maxi);
Run Code Online (Sandbox Code Playgroud)

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