向量和 for 不产生结果

Vector and for doesn't produce results

本文关键字:结果 for 向量      更新时间:2023-10-16

我正在研究一个简单的游戏(摇滚,纸,剪刀(,当我尝试使用其他向量作为条件的元素填充向量时,我就会遇到这个问题。代码可能更容易理解:

#include "stdafx.h"
#include "../../Library/std_lib_facilities.h"
// With the fibonacci series I can generate a secret sequence of number
int fib(int n){
    if (1 == n || 2 == n) {
        return 1;
    }
    else {
        return fib(n - 1) + fib(n - 2);
    }
}
// It shows the list of element in a given vector
void showVector(vector<int>myVector, string nameVector) {
    cout << "nn";
    cout << nameVector << " Debug: | ";
    for (int i = 1; i < 10; i++) {
        cout << myVector[i] << " | ";
    }
    cout << "nn";
}
// String variant
void showVector(vector<string>myVector, string nameVector) {
    cout << "nn";
    cout << nameVector << " Debug: | ";
    for (int i = 1; i < 10; i++) {
        cout << myVector[i] << " | ";
    }
    cout << "nn";
}
// Generate a sequence of number in a vector
vector<int> generateCode(int input) {
    vector<int>myVector;
    for (int i = 1; i <= 10; i++) {
        myVector.push_back(fib(i + input) % 3);
    }
    return myVector;
}
int main()
{
    // Secret sequence of moves, based on the value (0, 1 or 2) i will show Rock, Paper or Scissor
    vector<int>fibSeries;
    vector<string>movSeries;
    // Initialization and settings
    int input = 0;
    cout << "Digit an integer to start: ";
    while (cin >> input) {
        // Check the number to make sure is a valid one (i will implement a check later) and generate the secret code
        fibSeries = generateCode(input);
        // For each 0 i'll put Rock in the vector, same for 1 ( in this case paper ) and 2 ( scissor )
        for (int i = 0; i <= fibSeries.size(); i++) {
            if (fibSeries[i] == 0){
                movSeries.push_back("Rock");
            }
            else if (fibSeries[i] == 1) {
                movSeries.push_back("Paper");
            }
            else if (fibSeries[i] == 2) {
                movSeries.push_back("Scissor");
            }
            else {
                movSeries.push_back("Rock");
            }
        }
        // Shows the vector graphically, for debug.
        showVector(fibSeries, "fibisSeries");
        showVector(movSeries, "movSeries");
        // So for a combination of      1 - 2 - 0 - 1
        // The result should be:        Paper - Scissor - Rock - Paper
    }
    return 0;
}

执行代码后,我会得到一个(中止(。我不明白,我是C 的新手,所以如果一个愚蠢的错误,请原谅我。大多数代码都是复杂的,因为我有规则要遵循,因此,例如,如果我不研究某些东西,我将无法在这里使用它。我只想知道为什么代码不希望我将其用于向量!

for(int i = 0; i&lt; = fibseries.size((; i (

正如@yola所提到的,您比您更迭代一个元素:

如果您具有向量std::vector<char> v = {'a', 'b', 'c'};,则可以访问元素为:

v[0] (-> 'a')
v[1] (-> 'b')
v[2] (-> 'c')

通常,您的最大索引将为length - 1

for (int i = 0; i <= fibSeries.size(); i++)

迭代从0到或等于 size((;也就是说,0、1、2、3(4个元素,在3个元素矢量中(。

正确的代码应为:

for (int i = 0; i < fibSeries.size(); i++)
                 ^^^

,因此,您的问题是您应该始终使用< size,因为索引是基于0的<= size,将读取分配空间的末尾。


但是,如果我可以,C 11引入了基于范围的for -Loops的新样式,这将使您无法编写条件和迭代表达式:

map<int, string> movSeries = { { 0, "Rock"s }, { 1, "Paper"s }, { 2, "Scissors"s } };
vector<int> fibSeries(10);
auto input = 0;
while(cin >> input) {
    for(auto& i : fibSeries) {
        i = fib(input++) % 3;
    }
    cout << "nnDebug | ";
    copy(cbegin(fibSeries), cend(fibSeries), ostream_iterator<int>(cout, " | "));
    cout << "nnnnDebug | ";
    for(const auto i : fibSeries) {
        cout << movSeries[i] << " | ";
    }
    cout << endl << endl;
}