c++ 为什么cout不能输出vector的内容< string>?

hwamh0ep  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(160)

我试图在for循环中打印vector<string>的内容。我有一个类,它的方法可以将值插入vector<string>并返回它。然后我使用for循环打印内容。

相关代码如下:

class MyClass {
    vector<string> fizz_buzz (const int max) {
        vector<string> v1;
        const auto it = v1.begin();

        for (int i = 1; i <= max; i++) {
            if (i % 5 == 0 && i % 3 == 0) {
                v1.insert(it, "FizzBuzz!");
            } else if (i % 5 == 0) {
                v1.insert(it, "Buzz");
            } else if (i % 3 == 0) {
                v1.insert(it, "Fizz");
            } else {
                v1.insert(it, to_string(i));
            }
        }
        return v1;
    }
};

int main() {
    // MyClass my_class;
    MyClass* ptr1 = nullptr;
    const auto v1 = ptr1->fizz_buzz(100);
    for (const string &s : v1) {
        cout << s << "\n";
    }
    delete ptr1;
    return 0;
}

字符串

我希望有这样的输出:

1
2
Fizz
4
Buzz
Fizz
...

相反我一无所有

我怀疑问题是我的指针是空的,但我不知道为什么。

ijxebb2r

ijxebb2r1#

你通过一个nullptr对象指针在一个无效的MyClass对象上调用fizz_buzz(),这是一种 * 未定义的行为 *。你甚至根本不需要这个对象,因为它不包含任何fizz_buzz()正在使用的数据。
修复后,fizz_buzz()private,所以你的main()不能调用它。你需要把它改为public
修复此问题后,您将在空vector上调用vector::begin()(实际上返回vector::end()迭代器)并将其保存在it变量中,但每次调用vector::insert()时都不会更新it。插入操作使it无效,要在vector后面插入,每次都需要调用vector::end() fresh,或者只使用vector::push_back()
试试这个:

class MyClass {
public:
    static vector<string> fizz_buzz (const int max) {
        vector<string> v1;

        for (int i = 1; i <= max; i++) {
            if (i % 5 == 0 && i % 3 == 0) {
                v1.push_back("FizzBuzz!");
            } else if (i % 5 == 0) {
                v1.push_back("Buzz");
            } else if (i % 3 == 0) {
                v1.push_back("Fizz");
            } else {
                v1.push_back(to_string(i));
            }
        }
        return v1;
    }
};

int main() {
    const auto v1 = MyClass::fizz_buzz(100);
    for (const string &s : v1) {
        cout << s << "\n";
    }
    return 0;
}

字符串
Demo

dgtucam1

dgtucam12#

第一个问题:fizz_buzz是类的私有成员,所以你的程序无法编译。第二个问题:你试图解引用一个nullptr来调用fizz_buzz,所以即使我们修复了隐私问题,你的代码也有未定义的行为。在我的系统上,它会发生segfaults。
你不需要这个类,因为这个类不管理fizz_buzz函数需要访问的任何状态。摆脱它。只需编写一个函数fizz_buzz。然后在你的vector中使用push_back,而不是试图在开头插入。

vector<string> fizz_buzz(const int max) {
    vector<string> v1;

    for (int i = 1; i <= max; i++) {
        if (i % 5 == 0 && i % 3 == 0) {
            v1.push_back("FizzBuzz!");
        } else if (i % 5 == 0) {
            v1.push_back("Buzz");
        } else if (i % 3 == 0) {
            v1.push_back("Fizz");
        } else {
            v1.push_back(to_string(i));
        }
    }

    return v1;
}

字符串
main中:

int main() {
    const auto v1 = fizz_buzz(100);

    for (const string &s : v1) {
        cout << s << "\n";
    }

    return 0;
}

相关问题