Почему я получаю сообщение об ошибке «несовместимые векторные итераторы», когда хочу запустить функцию «klimaTag()»? Я хочу дать ему итератор векторных температур. Как мне это сделать? Я хочу только перебрать вектор в основной функции.
#include <iostream>
#include <vector>
class TemperatureCalculator {
private:
std::vector<float> temperatures;
public:
TemperatureCalculator(std::vector<float> temperatures) {
this->temperatures = temperatures;
}
std::string klimaTag(std::vector<float>::iterator i) {
if (*i >= 25 and *i < 30) {
return "Sommertag";
}
else if (*i >= 30 and *i < 35) {
return "Heißer Tag";
}
else if (*i >= 35) {
return "Wüstentag";
}
else {
return "Normaltag";
}
}
void get_user_input() {
int numberDays;
std::cout << "Wie viele Tage möchten Sie auswerten?" << std::endl;
std::cin >> numberDays;
float current_temp;
for (int i = 0; i < numberDays; i++) {
std::cout << "Hoechsttemp für Tag " << i + 1 << " eingeben: ";
std::cin >> current_temp;
temperatures.push_back(current_temp);
}
}
std::vector<float> get_temperature() {
return this->temperatures;
}
};
int main()
{
TemperatureCalculator t({});
t.get_user_input();
for (std::vector<float>::iterator i = t.get_temperature().begin(); i != t.get_temperature().end(); i++) {
std::cout << "Tag " << *i + 1 << " ist ein " << t.klimaTag(i) << std::endl;
}
}
Невозможно воспроизвести, см.: wandbox.org/permlink/FQv4TzSJJUh3FPOs
@PaulSanders Это утверждение отладки итератора Visual Studio. Я не знаю, делает ли gcc то же самое или нет.
@RetiredNinja А, хорошо, в этом есть смысл.
Вы возвращаете копию вектора в get_temperature
и поэтому используете итератор временного вектора в
std::vector<float>::iterator i = t.get_temperature().begin()
Решение состоит в том, чтобы вернуть ссылку:
class TemperatureCalculator {
private:
std::vector<float> temperatures;
// ...
public:
const std::vector<float>& get_temperature() const { return this->temperatures; }
// Possibly:
//std::vector<float>& get_temperature() { return this->temperatures; }
};
Обратите внимание, что передача простого итератора кажется странной, в то время как передача значения выполняет свою работу:
std::string klimaTag(float f) const
{
if (25 <= f and f < 30) {
return "Sommertag";
}
else if (30 <= f and f < 35) {
return "Heißer Tag";
}
else if (*35 <= f) {
return "Wüstentag";
}
else {
return "Normaltag";
}
}
и поэтому ваш цикл становится:
for (float f : t.get_temperature()) {
std::cout << "Tag " << f + 1 << " ist ein " << t.klimaTag(f) << std::endl;
}
get_temperature
возвращает другую копию вектора каждый раз, когда вы его вызываете. Вам нужно вернуть ссылку.