如何将基本字符串中的字符复制到向量字符串中?

Posted

技术标签:

【中文标题】如何将基本字符串中的字符复制到向量字符串中?【英文标题】:How to copy a character from basic string into a vector string? 【发布时间】:2022-01-05 09:38:46 【问题描述】:

//定义类

class Hangman

    private:
        vector<string> dictionary;          //stores all the words
        vector<string> secretWord;          //stores the secret word
        vector<string> misses;              //keeps record of wrong guesses
        vector<string> displayVector;           //Stores "_"
        string originalWord;                //stores a copy of secret word to display at the 
end of game.
        bool gameOver = false;                      //Flag to check if the player lost or 
still in the game.
        int totalAttempts;
            
    public:                                 
    void selectRandWord();                      
;

//这是我遇到问题的函数。

void Hangman::selectRandWord()

    secretWord.clear();

//word 是存储随机单词的基本字符串。让我们说“Hello World”。

    string word;
    srand(time(NULL)); 
    int random = (rand() % dictionary.size()) + 1;

//我从一个向量到另一个词存储一个随机词。

    word = dictionary[random];
    transform(word.begin(), word.end(), word.begin(), ::tolower);           
    originalWord = word;
    for (int index = 0; index < word.length(); index++) 
     

//这行有错误:[Error] invalid user-defined conversion from 'char' to 'std::vectorstd::basic_string::value_type&& aka std::basic_string&&' [-fpermissive]

//我要做的是从单词中取出每个字符(例如:“H”)并将其推回向量字符串secretWord中。

        secretWord.push_back(word[index]); 
     

【问题讨论】:

为什么secretWord首先是vector&lt;string&gt;?不应该是string吗? 我没有在这里发布我的完整程序,但基本上,我希望能够使用向量库函数,如 pop、pushback、erase 等。 【参考方案1】:

您的secretWord 现在是vector&lt;string&gt; 类型,因此它可能是许多单词的集合,我不确定从名称来看您是否真的打算拥有这些单词。如果确实没问题,并且您想将word 中的每个字符作为单独的string 存储在secretWord 中,那么您需要将push_back 调用替换为emplace_back 调用,因为另一种方法实际上做了两件事一次:从传递给它的char 构造一个string,并将string 附加到容器的末尾,就像这样

secretWord.emplace_back(1, word[index]); 

仅仅push_back 失败,因为它需要提供您的vector 存储类型的对象,因此您也可以通过从char 显式构造string 来解决您的问题:

secretWord.push_back(string(1, word[index])); 

如果您对复制/移动详细信息感兴趣,我建议您阅读以下内容:emplace back reference 和 push back reference。

【讨论】:

当我使用 emplace_back 并尝试编译程序时,它会打开一些名为“allocator.h”的文件。在这个文件中,它给出了错误。基本上它说:[错误]从'char'到'const char *'的无效转换[-fpermissive]。在文件 allocator.h 中显示此错误的代码是: ::new((void *)__p) _Up(std::forward<_args>(__args)...); 我添加了显示错误的程序屏幕截图。 @muhammadmuzaib 我的错,我实际上不知道你不能在 C++ 中从单个 char 构造一个 string 而不指定你希望 char 重复的次数(已复制)在string 中(参见#2 下的docs)。因此,请按照以下方式进行操作:secretWord.emplace_back(1, word[index]); 同样,C++ 引用对您有很大的帮助,例如,您可以发现另一种解决方案是将 char 转换为指向 char 的指针(匹配basic_string构造函数版本#5) @muhammadmuzaib 至于char* 版本,请记住,被视为char* 指向的连续字节的字符串需要以空值结尾,因此其他版本的构造可能很棘手并且需要显式空值终止。但是,还有很多其他选项可以将 char 转换为 string 列出的 here。 谢谢。它奏效了。

以上是关于如何将基本字符串中的字符复制到向量字符串中?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改 lambda 中的字符串向量

提升精神:将结果复制到字符串向量中

如何将字符串添加到 C++ 中无序映射中的字符串向量

如何将字符串数组中的所有项目添加到 Java 中的向量中?

将文本文件中的单个字符存储到向量 C++ 中时的 std::bad_alloc

如何将字符串中的所有数字映射到 Python 中的列表? [复制]