从标题来看,我有点以相当复杂的方式完成了我的计划。但!我不妨问问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一旦我能,我会!再次感谢!
答案 0 :(得分:2)
如果单词始终是空格分隔的,最简单的分割方法是使用字符串流:
string words = .... // populat
istringstream is( words );
string word;
while( is >> word ) {
cout << "word is " << word << endl;
}
当然,您需要编写一个函数来执行此操作,并将其应用于您的字符串。或者最好不要将字符串存储在allm中,而是在初始输入时分割成单词。
答案 1 :(得分: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的解决方案那么简短,但除了已经使用的内容之外,不需要空间和额外分配。
答案 2 :(得分:1)
使用诸如listed here in section 7.3之类的标记生成器将向量中的字符串拆分为单个单词(或重写它以便它只返回标记的数量)并循环遍历向量以计算总数你遇到的令牌。