У меня проблема с запуском моего небольшого фрагмента кода. У меня есть вектор, который считывает температуру с пользовательского ввода. Я хочу немного обработать данные. Указание, какой это был день (жаркий день, летний день и т. д.) и какой день был самым жарким. Но каждый раз, когда я хочу получить максимальную температуру с помощью функции maxNumber, я получаю 2 ошибки, которых не понимаю:
non-standard syntax; use '&' to create a pointer to member
"! = ": Function overload cannot be resolved
Пожалуйста помоги! Спасибо большое
Код:
#include <iostream>
#include <vector>
std::string klimaTag(float a) {
if (a >= 25 and a < 30) {
return "Sommertag";
}
else if (a >= 30 and a < 35) {
return "Heißer Tag";
}
else if (a >= 35) {
return "Wüstentag";
}
else {
return "Normaltag";
}
}
float maxNumber(std::vector<float> &a) {
float current_max = 0;
for (int i = a.begin; i != a.end; i++) {
if (a.at(i) > current_max) {
current_max = a.at(i);
}
return current_max;
}
}
int main()
{
std::vector<float> temperatures;
float current_temp;
for (int i = 0; i < 5; i++) {
std::cout << "Hoechsttemp für Tag " << i << " eingeben: ";
std::cin >> current_temp;
temperatures.push_back(current_temp);
}
for (int i = 0; i < 5; i++) {
std::cout << "Tag " << i + 1 << " ist ein " << klimaTag(temperatures.at(i)) << std::endl;
}
std::cout << maxNumber(temperatures);
}
a.end
относится к адресу функции, вам нужно вызвать саму функцию с помощью a.end()
, отсюда и жалоба на нестандартный синтаксис, как будто вы хотели взять адрес функции, которую вы могли бы вызвать &a.end
. То же самое с a.begin
.
Чтобы использовать цикл for, как вы описали, вам нужно int i = 0; i < a.size()
. Более того, оператор return
находится внутри цикла for в maxNumber. Это не то, что вы хотите (он выходит из первого цикла цикла), поместите его снаружи.
Begin и end на самом деле являются методами работы с итераторами. Чтобы использовать их, вы должны немного изменить цикл.
begin
и end
— это функции, которые нужно вызывать как функции: begin()
и end()
.
Однако вы можете использовать цикл for на основе диапазона, например:
float maxNumber(std::vector<float> &a) {
float current_max = 0;
for (auto const i : a) {
if (i > current_max) {
current_max = i;
}
}
return current_max;
}
Пожалуйста, обратите внимание, где я разместил ваше заявление о возврате. Он находится вне цикла for.
Прежде всего, begin()
и end()
- это метод, поэтому вы получаете эту ошибку, потому что пытаетесь сослаться на функцию, поэтому для нее должен потребоваться оператор адреса.
Во-вторых, begin()
и end()
возвращают iterator
, а не индекс, и вы очищаете, пытаясь получить доступ к индексу.
В-третьих, вы всегда возвращаетесь после первого цикла, так как ваш возврат находится внутри него и должен быть снаружи.
Для правильного цикла вашего массива достаточно использовать цикл for range
float maxNumber(std::vector<float> &a) {
float current_max = 0;
for(const auto& element : a) {
if (element > current_max){
current_max = element;
}
}
return current_max;
}
если вы хотите использовать старый способ, вы всегда можете сделать
float maxNumber(std::vector<float> &a) {
float current_max = 0;
for(int i=0; i<a.size(); ++a) {
if (a.at(i) > current_max){
current_max = a.at(i);
}
}
return current_max;
}
И, конечно же, std::max_element
сделает большую часть работы за вас. +1.
В этом цикле for
вы знаете, что i
является допустимым индексом, потому что вы написали его таким образом. Нет необходимости в дополнительных накладных расходах на использование at(i)
.
@PeteBecker, я просто использовал тот же синтаксис
Да, я знаю. Это все равно перебор. <г>
Попробуйте начать() и закончить() с помощью()...