【问题标题】:Vector display iterator ends prematurely [duplicate]矢量显示迭代器过早结束[重复]
【发布时间】:2021-03-16 22:35:00
【问题描述】:

我目前正在为我在大学的一门入门课程做一个期末项目,我似乎无法找出为什么我的输出会过早地中断。我正在尝试将同一目录中的文本文件的行附加到向量中,并从向量中随机选择以获取基于文本的格斗游戏中敌人的名称,但在测试期间,它似乎只是向量包含三个项目或最后一个 for 循环(注释块之前的那个,我正在分块处理)只显示三个可能的名称。代码如下:

#include <iostream>
#include <fstream>
#include <ctime>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <unordered_map>
#include <ctype.h>

using namespace std;

int main() {
    
    srand(time(0));
    
    int userInput;
    int player_health = 100;
    int boss_health = 200;
    int boss_index = rand() % 3;
    ifstream boss_list;
    string boss_name = "";
    string boss_inputs[3] = {"MACHINE GUN", "BOMB ATTACK", "CANE SMACK"};
    string user_inputs[3] = {"SWORD ATTACK", "BOMB ATTACK", "MAGIC ATTACK"};
    vector<string> boss_list_holder = {};
    
    
    unordered_map<string, int> attacks = {
        {"SWORD ATTACK", rand() % 100},
        {"BOMB ATTACK", rand() % 100},
        {"MAGIC ATTACK", rand() % 100}
    };
    
    
    unordered_map<string, int> boss_attacks = {
        {"MACHINE GUN", rand() % 75},
        {"BOMB ATTACK", rand() % 80},
        {"CANE SMACK", rand() % 50}
    };
    
    boss_list.open("names.txt", ios::in);
    
    while(getline(boss_list, boss_name)) {
        //cout << boss_name << endl;
        boss_list_holder.push_back(boss_name);
    }
    

    for(int j=0; j<(sizeof(boss_list_holder)/sizeof(boss_list_holder[0])); j++) {
        cout << boss_list_holder[j] << endl;
    }

    
    //cout << "BOSS FIGHT SIMULATOR\n\n";
    
    /*
    while(userInput > 3 || userInput < 1) {
        cout << "Enter the attack you want to use!\n";
        
        for(int i=0; i<sizeof(user_inputs)/sizeof(user_inputs[0]); i++) {
            cout << i + 1 << ". " << user_inputs[i] << " ";
        }
        
        cout << "\n";
        
        cin >> userInput;
        
    };
    */
    
    
    
    /*
    cout << boss_inputs[boss_index] << " ";
    cout << boss_attacks[boss_inputs[boss_index]];
    */
    
    return 0;
    
}

我们将不胜感激。谢谢!

【问题讨论】:

    标签: c++ file vector output


    【解决方案1】:
    sizeof(boss_list_holder)/sizeof(boss_list_holder[0])
    

    这是一种非常老式的推导数组长度的方法,实际上它只适用于数组

    它甚至不适用于指针,人们经常在没有意识到它的情况下使用指针而不是数组,因此std::size(boss_list_holder) 是一个更好的通用解决方案。

    在您的情况下,只需 boss_list_holder.size() 是您最好的选择。

    您还应该使用unsigned int(或者,理想情况下,std::size_t)作为数组或向量索引,如果您坚持使用int,您的编译器会警告您有关不安全的有符号/无符号比较。

    (有些人会走得更远,推荐std::vector&lt;string&gt;::size_type,虽然我个人认为这有点矫枉过正。)

    【讨论】:

    • 感谢您的帮助。无法记住所有预定义的方法、函数等。
    • @JustinMcCown 你不需要记住它们!您只需咨询a reference即可。
    • 从技术上讲,应该使用std::vector::size_type,这是常见 size_t,但不是必需,它可能是别的东西。在可行的情况下考虑使用auto,例如:auto size = boss_list_holder.size(); for(decltype(size) j = 0; j &lt; size; ++j) 虽然range-based for loop 会更好:for(const auto &amp;boss: boss_list_holder) { ... }
    • @RemyLebeau 我提到了 ;) std::size_t 肯定足够大,所以...
    【解决方案2】:

    您的for 循环在boss_list_holder 向量上是错误的:

    for(int j=0; j<(sizeof(boss_list_holder)/sizeof(boss_list_holder[0])); j++)
    

    这个sizeof 技巧仅适用于固定大小的数组(如您的user_input),其中元素直接存储在数组本身分配的内存中。

    这不适用于像 std::vector 这样的动态容器,boss_list_holder 是其中的一个实例。 std::vector 的元素不存储在std::vector 对象本身的分配内存中(即sizeof(boss_list_holder) 不等于sizeof(string) * NumberOfStrings)。它们存储在一个分配在内存其他地方的数组中,std::vector 对象只是保存一个指向该数组的指针(除其他外)。

    您需要改用向量的size() 方法,该方法将返回已放入std::vector 内部数组的元素数:

    for(size_t j = 0; j < boss_list_holder.size(); ++j)
    

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多