有没有更好的方法来检测向量中一个项目的多次出现?

Is there a better way to detect multiple occurrences of an item in my vector?

本文关键字:项目 一个 方法 更好 检测 向量 有没有      更新时间:2023-10-16

我是STL的初学者,我用它来制作一个简单的刽子手项目。完整代码在这里:https://github.com/SamtheSaint/Hangman。

我需要检测向量中多次出现的字母,但我做不到,最终解决了它以完成程序。有没有更简单的方法可以做到这一点?

iter = find(gameWord.begin(), gameWord.end(), playGuess);
if (iter == gameWord.end()) {
guesses--;
}
while (iter != gameWord.end()) {
iter = find(gameWord.begin(), gameWord.end(), playGuess);
if (iter != gameWord.end()) {
int index = distance(gameWord.begin(), iter);
hiddenWord[index] = playGuess;
*iter = '0'; // so program can find the next one
}
}

我最终破坏了gameWord向量,所以我必须在它所在的循环开始时制作一个副本(我称之为checkWord),以便以后可以将其与hiddenWord进行比较。

你不需要std::map.
您只需要两个std::string(一个是猜测表达式,另一个是显示给玩家的模式),它们将保持同步。这意味着你应该把它们括在课堂上。

不要让事情变得更复杂,这是必要的。 这很简单:

class Hangman {
public:
constexpr SecretChar = '_';
Hangman(const std::string& secret)
: mSecret(secret)
{
provideMask();
}
bool guess(char ch) {
auto index = mSecret.find(ch);
if (index == std::string::npos) return false;
if (already_guessed(index)) return false;
updateMaskWith(ch);
return true;
}
std::string mask() const {
return mMask;
}
private:
void provideMask() {
mask = mSecret;
std::replace_if(mMask.begin(), mMask.end(), std::isalpha, SecretChar);
}
bool already_guessed(int index) {
return mMask[index] != SecretChar;
}
void updateMaskWith(char ch) {
auto index = mSecret.find(ch);
while (index == std::string::npos) {
mMask[index] = ch;
index = mSecret.find(ch, index + 1);
}
}
private:
std::string mSecret;
std::string mMask;
};

现在编写单独的代码,它将使用它并保持分数,你几乎完成了。