在向量中的字符串中查找字符

Posted

技术标签:

【中文标题】在向量中的字符串中查找字符【英文标题】:Finding character in String in Vector 【发布时间】:2010-04-19 09:08:29 【问题描述】:

从标题来看,我的程序有点复杂。但!反正我也可以问xD

这是我在回答 Accelerated C++ 的问题 3-3 时编写的一个简单程序,在我看来这是一本很棒的书。

我创建了一个向量:

vector<string> countEm;

接受所有有效字符串。因此,我有一个包含字符串元素的向量。

接下来,我创建了一个函数

int toLowerWords( vector<string> &vec )

    for( int loop = 0; loop < vec.size(); loop++ )
        transform( vec[loop].begin(), vec[loop].end(),
            vec[loop].begin(), ::tolower );

将输入拆分为所有小写字符以便于计数。到目前为止,一切顺利。

我创建了第三个也是最后一个函数来实际计算单词,这就是我被困住的地方。

int counter( vector<string> &vec )


for( int loop = 0; loop < vec.size(); loop++ )
    for( int secLoop = 0; secLoop < vec[loop].size(); secLoop++ )
    
        if( vec[loop][secLoop] == ' ' )

这看起来很荒谬。使用二维数组调用向量的字符,直到找到一个空格。荒谬的。我不相信这是一个优雅甚至可行的解决方案。如果这是一个可行的解决方案,我会从空格中回溯并复制我在单独的向量中找到的所有字符并计算 那些

那么我的问题是。如何将字符串向量分解为单独的单词,以便我可以实际计算它们?我考虑过使用 strchr,但它并没有给我任何顿悟。


Neil 的解决方案:

stringstream ss( input );
while( ss >> buffer )
    countEm.push_back( buffer );

从中我可以很容易地数出(重复出现的)单词。

然后我通过 Wilhelm 做了一个解决方案,因为我不小心删除了该解决方案,所以我会在重新编写后发布它!我很愚蠢,但我会在我再次写下它时发布它^^

我要感谢大家的意见!解决方案奏效了,我成为了一个更好的程序员。如果我可以投票支持您的内容,那么我会:P 一旦可以,我会的!再次感谢!

【问题讨论】:

【参考方案1】:

如果单词总是用空格分隔,最简单的分割方法是使用字符串流:

string words = ....   // populat
istringstream is( words );

string word;
while( is >> word ) 
   cout << "word is " << word << endl;

当然,您希望编写一个函数来执行此操作,并将其应用于您的字符串。或者最好不要将字符串全部存储,而是在初始输入时拆分成单词。

【讨论】:

嘿!我从来没有使用过istringstream,所以我真的不知道你在这里工作什么样的魔法,但如果我能用这个解决方案解决问题,我会告诉你^^所以谢谢!和上面一样,一旦我获得许可,我会打勾。【参考方案2】:

您可以使用std::istringstream 逐个提取单词并进行计数。但是这个解决方案在空间复杂度上消耗了 O(n)。

string text("So many words!");
size_t count =  0;
for( size_t pos(text.find_first_not_of(" \t\n"));
    pos != string::npos;
    pos = text.find_first_not_of(" \t\n", text.find_first_of(" \t\n", ++pos)) )
    ++count;

也许没有 Neil 的解决方案那么短,但除了已经使用的内容之外,不会占用任何空间和额外分配。

【讨论】:

感谢您的回复^^ 我还不能投票,所以我会回复您的回复。我还没有听说过你使用的一些语法,所以我正在研究一下,我会让你知道我的表现如何,但感谢你的帮助! 除了我遇到的语义错误(text::npos 而不是string::npos,我刚刚更正了),语法没有什么特别之处。也许缩进让你感到困惑......这是一个简单的for 循环,真的。 ... 和一个逻辑错误。 ew,我应该在发布之前真正测试我的代码。 :s 没关系,轮到我写的时候才发现问题。您的解决方案仍然有效,所以欢呼和感谢!我会将其发布在编辑中,以便其他人在我重新编写后可以看到。谢谢!【参考方案3】:

使用诸如listed here in section 7.3 之类的标记器将向量中的字符串拆分为单个单词(或重写它以使其仅返回标记的数量)并循环遍历向量以计算您的标记总数相遇。

【讨论】:

嗨,Jiles!我已经开始阅读它并且我考虑过使用标记器,但是我在查找 strtok 之前找到了 strchr 并且它更安全。我也会让你知道我是否可以用这个解决方案来回答它,因为我想将它们都用作可能的答案,这样我以后就可以尽可能多才多艺^^

以上是关于在向量中的字符串中查找字符的主要内容,如果未能解决你的问题,请参考以下文章

查找数据框中包含字符串向量中的一个元素的行的索引

在向量中查找字符串的索引

C ++在字符串向量中查找字符串的频率

查找两个字符串向量的交集

在字符向量列表中查找任何交集

C++:如何检测向量中的重复项并打印一份?