首页 > 解决方案 > “向量迭代器不兼容。” 如何将它作为参数传递给函数?

问题描述

当我想运行函数“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;
    }
}

标签: c++loopsoopvectoriterator

解决方案


您返回向量 in 的副本get_temperature,因此使用临时向量的迭代器 in

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;
}

推荐阅读