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

Posted

技术标签:

【中文标题】有没有更好的方法来检测我的向量中某个项目的多次出现?【英文标题】:Is there a better way to detect multiple occurrences of an item in my vector? 【发布时间】:2019-07-16 12:54:31 【问题描述】:

我是 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 进行比较。

【问题讨论】:

“检测”是什么意思?删除重复项?如果至少找到一个重复项,返回true?代码本身并不能说明问题。 我需要检测向量中多次出现的字母——我不太明白。你的意思是已经填写了答案的向量?如果是这样,那为什么要等到游戏中间才检测是否有重复?您应该事先设置正确的结构来告诉您重复项在哪里。例如,std::unordered_map<char, std::vector<int>> 已经用找到的字母和位置进行了初始化。 请提供minimal reproducible example 和所需行为的示例。您是否正在寻找std::replace_if 老实说,我认为unordered_map<char, std::vector<int>>,其中字符是字母,向量表示字母所在的位置,对于这样的程序来说,它比仅仅一个向量更好。当用户猜出正确的字母时,很容易知道要填写哪些位置,因为该信息在地图中。无需搜索。 See this simple example using a map。唯一要做的就是在地图中搜索字母。如果找到,则抓取所有位置并将这些位置填充到输出向量中。我知道你说你是 STL 的新手,但这主要是在思考哪种类型的数据结构最适合——你不需要为此了解 STL。 【参考方案1】:

你不需要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;
;

现在编写单独的代码来使用它并保持分数,你就差不多完成了。

【讨论】:

以上是关于有没有更好的方法来检测我的向量中某个项目的多次出现?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有训练的情况下识别人脸

有没有比我的实现更好的方法来检查更新的文件?

车辆分割和跟踪

如何有效地将结构向量写入文件?

计算独特项目的更好方法

获取向量的最后 n 个元素。有没有比使用 length() 函数更好的方法?