从我的向量打印的项目数与向量中的假定项目数不一致[关闭]
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");
wordSets
有 24
空项目和项目 "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()。
【讨论】:
以上是关于从我的向量打印的项目数与向量中的假定项目数不一致[关闭]的主要内容,如果未能解决你的问题,请参考以下文章