从我的向量打印的项目数与向量中的假定项目数不一致[关闭]

Posted

技术标签:

【中文标题】从我的向量打印的项目数与向量中的假定项目数不一致[关闭]【英文标题】:The number of items printed from my vector is inconsistent with the supposed number of items IN the vector [closed] 【发布时间】:2014-06-19 21:08:34 【问题描述】:

我正在制作一个单词搜索游戏,我一直在尝试从一个已经存在的vector 中随机获取一组数字,这些数字已经被洗牌了。我可以这样做,但是当我遍历vector 并打印字符串时,字符串的数量与numWords 返回的值不一致,numWords 应该返回vector 中的项目数。

我一遍又一遍地查看它,但我无法弄清楚为什么它大部分时间都不一致。另外,我试图在THE_SET 中获得一组固定的 8 个单词,但不一致促使我尝试随机数量的单词,但仍然不一致。如果有办法让THE_SET 始终包含 8 个随机单词,我想知道。

**编辑:我已经解决了问题,谢谢。 [:我现在也明白了。我只是不知道我是否将调试与任何东西混淆了......因为我单击“调试”来检查错误并运行我的文件。嗯。我仍然是初学者和练习者,所以我忘记了我读过的一些东西......如果我误解了任何人,我很抱歉。

其他一切似乎都运行良好。

// word search.cpp : main project file.

#include "stdafx.h"
#include <iostream>
#include <string>
#include <algorithm>
#include <ctime>
#include <vector>
#include <cctype>
#include <iterator>

using namespace std;

void dispBoard(const vector<string>& wordSet);
void checkGuess(string entry, const vector<string>& wordSet);
int numWords(const vector<string>& wordSet);

string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int numLeft = 0;

int main()

    srand(static_cast<unsigned int>(time(0)));


    random_shuffle(alphabet.begin(), alphabet.end());

    vector<string> wordSets;
    wordSets.push_back("CHICKEN");
    wordSets.push_back("BEEF");
    wordSets.push_back("DISHONOR");
    wordSets.push_back("LAWNMOWER");
    wordSets.push_back("LEGEND");
    wordSets.push_back("PROGRAMMING");
    wordSets.push_back("DEVELOPER");
    wordSets.push_back("HOMEWORK");
    wordSets.push_back("TERRIBLE");
    wordSets.push_back("VACATION");
    wordSets.push_back("PYTHON");
    wordSets.push_back("RUBY");
    wordSets.push_back("POKEMON");
    wordSets.push_back("BORDERLANDS");
    wordSets.push_back("INFINITE");
    wordSets.push_back("SMASH");
    wordSets.push_back("BROTHERS");
    wordSets.push_back("SNAKES");
    wordSets.push_back("HAMSTER");
    wordSets.push_back("ELEPHANT");
    wordSets.push_back("BUFFALO");
    wordSets.push_back("PILLOW");
    wordSets.push_back("PASTA");
    wordSets.push_back("RAMEN");

    random_shuffle(wordSets.begin(), wordSets.end());
    vector<string> THE_SET(wordSets.begin(), wordSets.begin() + (rand() % 15 + 1)); //vector of current word set, formed from wordSets
    //I'd like this to be fixed at 8 words
    int MAX_WORDS = numWords(THE_SET);  //reinitialization to number of words in THE_SET--why is it inconsistent with printed words???
    numLeft = numWords(THE_SET);

    cout << "number of words left: " << numLeft << " and MAX WORDS: " << MAX_WORDS << "\n\n";   //checks num of words

    vector<string>::iterator iter;

    for(iter = THE_SET.begin(); iter != THE_SET.end(); iter++)      //prints words in THE_SET--but number of words counted by hand are usually 
                                                                   //inconsistent
        cout << *iter << " ";
    

    cout << "\n\n";
    string entry; 


    do             //main loop of game
        dispBoard(THE_SET);
        cout << "You have " << numLeft << " words left to find. \n\n";
        cout << "(Enter 'EXIT' if you wish to quit the game.)\n";
        cout << "Enter your find in UPPERCASE: ";
        cin >> entry;
        cout << "\n\n";
        if(entry == "EXIT") 
            return 0;
        
        else 
            checkGuess(entry, THE_SET);
        

     while(numLeft != 0);

    cout << "Congrats! You found all " << MAX_WORDS << " words!!\n\n";

    system("PAUSE");


void dispBoard(const vector<string>& wordSet)  //this displays a bunch of random letters around the words in THE_SET
    vector<string>::const_iterator iter;
    for(iter = wordSet.begin(); iter != wordSet.end(); iter++) 
    
        cout << alphabet.substr(rand() % 8, (rand() % 32 + 1)) << *iter << alphabet.substr(rand() % 8, (rand() % 32 + 1)) << endl;
    


void checkGuess(string entry, const vector<string>& wordSet) 
    if(entry == "EXIT")
    
        cout << "Quitting game.\n\n";
        return;
    
    else
    
        vector<string>::const_iterator iter;
        for(iter = wordSet.begin(); iter != wordSet.end(); iter++) 
            if(entry == *iter)
            
                cout << "That's right! " << entry << " is in the search!\n\n";
                numLeft--;
            

        
    


int numWords(const vector<string>& wordSet)     //supposed to count number of strings in a given vector, but it's inconsistent. Why??

    unsigned int i = 0;
    vector<string>::const_iterator iter;
    for(iter = wordSet.begin(); iter != wordSet.end(); iter++)
    
        i++;
    
    return i;

【问题讨论】:

一个调试器逐步检查你的程序可能比仅仅'一遍又一遍地查看'更好的方法! "这是一个调试器无法捕获的问题" - 怀疑它 - "代码正在做一些我不知道它会做的事情 " - 这似乎是调试器的用例。 @izaheichou - 调试器没有显示你在每个 push_back 的向量中有 25、26、27、28,... 项?如果它没有清楚地向您显示这一点,那调试器就会很臭。 @izaheichou '但是这个错误并没有被它捕获'我感觉你把调试和抛出的异常混淆了(以及自动调试器的启动) @izaheichou - VS 调试器应该显示向量中的项目数,并且每个条目都是空白的。仅出于学习目的,将 24 放回代码中,但这一次,在您开始调用 push_back 之前使用调试器检查向量。您应该会看到它从 24 项开始。 【参考方案1】:

当你执行这些行时:

vector<string> wordSets(24);
wordSets.push_back("CHICKEN");

wordSets24 空项目和项目 "CHICKEN"。我怀疑,你不是那个意思。将第一行更改为:

vector<string> wordSets;

应该修复错误数量的问题。

如果你想减少调用push_back分配内存的次数,你可以使用:

vector<string> wordSets;
wordSets.reserve(24);

这将确保wordSets 有足够的内存来容纳24 对象。

【讨论】:

【参考方案2】:

详细说明R Sahu的答案:写作

vector<string> wordSets(24);

等价于

vector<string> wordSets;
wordSets.resize(24);

wordSets 被初始化为一个包含 24 个元素的向量,您可以使用 operator[] 访问它们。通过push_back向向量添加元素,向量的大小增加到25。

你可能打算做的是为 24 个字符串保留足够的空间,这样向量就不需要为前 24 个添加调整大小和重新分配内存。您可以按如下方式实现:

vector<string> wordSets;
wordSets.reserve(24);

还可以查看cplusplus.com's reference of std::vector 上的reserve() 和resize()。

【讨论】:

以上是关于从我的向量打印的项目数与向量中的假定项目数不一致[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中返回向量的行为不一致

在 C++ 中声明向量后无法打印任何内容

在c ++中声明向量后无法打印任何内容

查找向量中的最小项目列表

当需要的拆分字符向量对于变量 (R) 中的所有观测值不一致时使用 strsplit

for 循环只打印一半的值(使用向量)