在向量中的字符串中查找字符
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 并且它更安全。我也会让你知道我是否可以用这个解决方案来回答它,因为我想将它们都用作可能的答案,这样我以后就可以尽可能多才多艺^^以上是关于在向量中的字符串中查找字符的主要内容,如果未能解决你的问题,请参考以下文章