C++ 如何使用STL算法找到最小值和最大值?

C++ 如何使用STL算法找到最小值和最大值?,c++,dictionary,stl,C++,Dictionary,Stl,我有restreent和评级。如何使用STL容器查找餐厅评级的最小值和最大值?我是否需要使用最大和最小评级的STL算法?我必须用任何方法找到平均评分 Id Name 1 McDonalds 2 Wendys 3 Burger King Id Resturent Rating 1 100 2 90 3 85 1 80 2 90 3 100 1 85 2 75 3 100 int main {

我有
restreent
评级
。如何使用STL容器查找餐厅评级的最小值和最大值?我是否需要使用最大和最小评级的STL算法?我必须用任何方法找到平均评分

Id  Name
1   McDonalds 
2   Wendys 
3   Burger King

Id  Resturent Rating
1     100
2     90
3     85
1     80
2     90
3     100
1     85
2     75
3     100




int main {

  map<int, string> resturent;

  stu.insert(pair<int, string>(1,  "McDonalds")));
  stu.insert(pair<int, string>(2, "Wendys")));
  stu.insert(pair<int, string>(3,"Burger King")));

  multimap<int, int> rating;
  testScore.insert(pair<int, int>(1, 10));
  testScore.insert(pair<int, int>(2, 9));
  testScore.insert(pair<int, int>(3, 8));
  testScore.insert(pair<int, int>(1, 8));
  testScore.insert(pair<int, int>(2, 6));
  testScore.insert(pair<int, int>(3, 10));
  testScore.insert(pair<int, int>(1, 5));
  testScore.insert(pair<int, int>(2, 7));
  testScore.insert(pair<int, int>(3, 9));
}

我想向你们展示一个可能的解决方案。有很多

我猜老师要求使用两个单独的容器,因为他可能想稍后解释数据库,其中有一个主键为“id”的父表“Student”,以及一个外键为“id”(非空)的相关子表“Score”

好的,那么让我们采用这种方法。我们创建了两个类:“学生”和“分数”。我们构建它的向量。然后我们有一个带有属性的表(向量)。类成员是表的属性。这些表是用一些测试值初始化的

为了显示所有学生的所有计算值,我们使用基于范围的for循环遍历“students”表。然后我们过滤“分数”表,用于当前评估的学生id。这类似于带有子查询的数据库where子句

无论如何。我们将有一个表格,只包含这个学生的分数。然后我们对STL容器使用标准算法,如和。
std::accumulate
用于计算平均值。所以,值的总和除以值的个数

对于算法,我们使用lambdas访问正确的元素

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <numeric>

struct Student
{
    unsigned int id{};
    std::string name{};

};
struct Score
{
    unsigned int id{};
    unsigned int score{};
};

std::vector<Student> students{ {1U,"John"},{2U,"Mary"},{3U,"Luke"},{4U,"Lisa"} };
std::vector<Score> scores{ {3U,100U},{4U,80U},{2U,90U},{1U,85U},{1U,95U},{2U,90U},{3U,80U},
                           {4U,95U},{3U,100U},{1U,80U},{2U,85U},{3U,95U},{1U,95U},{2U,100U},{3U,95U} };

int main()
{
    // Calculating all results
    for (const Student& student : students) {

        // Filter out the scores for this student
        std::vector<Score> scoreForThisStudent{};
        std::copy_if(scores.begin(), scores.end(), std::back_inserter(scoreForThisStudent), [&student](const Score & s) { return student.id == s.id; });

        // Check, if scores are available. Calculate only in this case
        if (scoreForThisStudent.size()) {
            std::cout << "\nStudent\nID: " << std::left << std::setw(4) << student.id << "    Name: " << student.name
                << "\nMin Score:        " << std::min_element(scoreForThisStudent.begin(), scoreForThisStudent.end(), [](const Score & s1, const Score & s2) {return s1.score < s2.score; })->score
                << "\nMax Score:        " << std::max_element(scoreForThisStudent.begin(), scoreForThisStudent.end(), [](const Score & s1, const Score & s2) {return s1.score < s2.score; })->score
                << "\nNumber of Scores: " << scoreForThisStudent.size()
                << "\nAverage:          " << std::accumulate(scoreForThisStudent.begin(), scoreForThisStudent.end(), 0U, [](const unsigned int s1, const Score & s2) {return s1 + s2.score; }) / scoreForThisStudent.size() << "\n";
        }
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
体类型
{
无符号整数id{};
std::字符串名{};
};
结构分数
{
无符号整数id{};
无符号整数分数{};
};
向量学生{1U,“约翰”},{2U,“玛丽”},{3U,“卢克”},{4U,“丽莎”};
向量得分{3U,100U},{4U,80U},{2U,90U},{1U,85U},{1U,95U},{2U,90U},{3U,80U},
{4U,95U}、{3U,100U}、{1U,80U}、{2U,85U}、{3U,95U}、{1U,95U}、{2U,100U}、{3U,95U};
int main()
{
//计算所有结果
for(const学生和学生:学生){
//过滤掉这个学生的分数
std::该学生{}的向量得分;
std::copy_if(scores.begin()、scores.end()、std::back_插入器(scoresforthistudent),[&student](const scores&s){return student.id==s.id;});
//检查,如果分数可用。仅在这种情况下计算
if(该学生的分数.size()){

std::cout您可以分别使用min\u元素(开始迭代器,结束迭代器)max\u元素(开始迭代器,结束迭代器),它们将迭代器返回到范围内的最大值。给您

#include <iostream>     
#include <algorithm>    

using namespace std;

int main () {
  int myints[] = {3,7,2,5,6,4,9};

  //Method 1
  int minElement = *min_element(myints, myints+7);
  int maxElement = *max_element(myints, myints+7);      
  cout<<"Max: "<< maxElement <<"\n";
  cout<<"Min: "<< minElement <<"\n";


  // Method 2: added by @HolyBlackCat
  int result = minmax_element(myints, myints+7);   //return a pair with iterator pointing to minimum element
  cout<<"Max: "<< *result.first <<"\n";
  cout<<"Min: "<< *result.second <<"\n";


  // Method 3:
  int result = minmax(myints, myints+7);   //return a pair of min,max element
  cout<<"Max: "<< result.first <<"\n";
  cout<<"Min: "<< result.second <<"\n";


  return 0;
}
#包括
#包括
使用名称空间std;
int main(){
int myints[]={3,7,2,5,6,4,9};
//方法1
int minElement=*最小元素(myints,myints+7);
int maxElement=*max_元素(myints,myints+7);

cout您可以定义以下类,
Ratings
,用于检索餐厅评级的统计信息:

#include <limits>

class Ratings {
   unsigned num_{0};  // number of ratings inserted
   long long sum_{0}; // sum of all the inserted ratings
   int min_{std::numeric_limits<int>::max()};
   int max_{std::numeric_limits<int>::min()};

public:
   void insert_rating(int rating) {
      // update minimum
      if (rating < min_)
         min_ = rating;

      // update maximum
      if (rating > max_)
         max_ = rating;

      // update sum
      sum_ += rating;

      // update number of ratings
      num_++;
   }

   double average() const {
      // calculate the average rating
      return (double)sum_ / num_; 
   }

   int min() const { return min_; }
   int max() const { return max_; }
};
该程序的输出为:

Restaurant: McDonalds, Id: 0
Max Rating: 10
Min Rating: 5
Average Rating: 7.66667

Restaurant: Wendys, Id: 1
Max Rating: 9
Min Rating: 6
Average Rating: 7.33333

Restaurant: Burger King, Id: 2
Max Rating: 10
Min Rating: 8
Average Rating: 9

您可以“使用最小/最大stl算法查找测试分数的最小值和最大值”通过阅读这些算法的文档,可以在任何一本优秀的C++书籍中找到,了解它们是如何工作的,然后将这些知识应用到你的特定应用程序中。如果在这些算法的描述中有特定的东西,或者它们是如何工作的,你不理解,那么这将是一个合理的、特定的、我很高兴在stackoverflow.com上提问,但事实上,这太模糊和宽泛了。stackoverflow.com是针对特定问题的,而不是定制的教程。@salmankhan为什么会有这种奇怪的设计?我认为对于
学生来说,包含
std::vector
来表示考试分数,以及id和姓名会更有意义另一个映射中的测试分数使得这比它应该的更困难。
class Student{int id;string name;std::vector testscores;}
--有什么原因不能使用这种简单的设计吗?随着时间的推移,老师们的要求越来越奇怪。这些奇怪的、非正统的“要求”并没有教你如何正确地设计程序学生们讨厌C++。“保罗麦肯齐的建议可以用两个容器来完成。第一个是<代码>向量<代码>,每个学生有一个条目,第二个是<代码>向量<代码>,每个学生都有考试成绩。我猜老师要求2个SEPA。费率容器,因为他可能想稍后解释数据库——如果是这样的话,那么讨论数据库的迂回方式是什么?用坏的C++设计来解释数据库表。哇。这两次遍历数组,这不是一件好事。最好使用<代码> Mimax元素> /Cal>。@ HyyBrCATA感谢添加了这种新方法。我也会尝试在我的代码中使用它。
#include <limits>

class Ratings {
   unsigned num_{0};  // number of ratings inserted
   long long sum_{0}; // sum of all the inserted ratings
   int min_{std::numeric_limits<int>::max()};
   int max_{std::numeric_limits<int>::min()};

public:
   void insert_rating(int rating) {
      // update minimum
      if (rating < min_)
         min_ = rating;

      // update maximum
      if (rating > max_)
         max_ = rating;

      // update sum
      sum_ += rating;

      // update number of ratings
      num_++;
   }

   double average() const {
      // calculate the average rating
      return (double)sum_ / num_; 
   }

   int min() const { return min_; }
   int max() const { return max_; }
};
int main() {
   // id to restaurant
   std::map<int, std::string> restaurant;

   restaurant.insert({0, "McDonalds"});
   restaurant.insert({1, "Wendys"});
   restaurant.insert({2, "Burger King"});

   // a Ratings object for each restaurant
   std::vector<Ratings> ratings(restaurant.size());

   ratings[0].insert_rating(10);
   ratings[1].insert_rating(9);
   ratings[2].insert_rating(8);
   ratings[0].insert_rating(8);
   ratings[1].insert_rating(6);
   ratings[2].insert_rating(10);
   ratings[0].insert_rating(5);
   ratings[1].insert_rating(7);
   ratings[2].insert_rating(9);

   for (int i = 0; i < ratings.size(); ++i) {
      std::cout << "Restaurant: " << restaurant[i] << ", Id: " << i << '\n';
      std::cout << "Max Rating: " << ratings[i].max() << '\n';
      std::cout << "Min Rating: " << ratings[i].min() << '\n';
      std::cout << "Average Rating: " << ratings[i].average() << '\n';
      std::cout << '\n';
   }
}
Restaurant: McDonalds, Id: 0
Max Rating: 10
Min Rating: 5
Average Rating: 7.66667

Restaurant: Wendys, Id: 1
Max Rating: 9
Min Rating: 6
Average Rating: 7.33333

Restaurant: Burger King, Id: 2
Max Rating: 10
Min Rating: 8
Average Rating: 9