2010-04-19 60 views
2

从标题判断,我有点用相当复杂的方式完成了我的程序。但!我不妨问问xD在字符串中查找字符在矢量中

这是一个简单程序我在回答加速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); 

是将输入转化为更容易计数全部小写。到现在为止还挺好。

我创建了第三个也是最后一个函数,实际上是count这个词,那就是我被卡住的地方。

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,但它没有给我任何epiphanies。通过尼尔


解决方案:

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

,从我可以很容易地算(经常性)字样。

然后我通过Wilhelm做了一个解决方案,我会重新编写它,因为我不小心删除了这个解决方案!愚蠢的我,但我会张贴,一旦我有它再次写^^

我想感谢你们所有的投入!解决方案已经工作,我成了一个更好的程序员。如果我可以投票你的东西,那么我会:P一旦我可以,我会的!并再次感谢!

回答

2

如果的话向来空格分隔,分裂他们的最简单的方法是使用一个字符串流:

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

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

你会想要写一个函数来做到这一点,当然,并将其应用到你的琴弦。或者最好不要将字符串存储在allm中,而是在初始输入时分割为单词。

+0

嘿!我从未使用istringstream,所以我不知道你在这里工作的是什么样的魔法,但是如果我可以用这个解决方案解决问题,我会告诉你^^所以,谢谢!如上所述,一旦获得许可,我会选择积极的态度。 – IAE 2010-04-19 15:27:29

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的解决方案那么短,但是除了已经使用的内容外,没有空间和额外分配。

+0

感谢您的回复^^我还不能投票,所以我会回复您的回复。我还没有听说过你使用的一些语法,所以我正在研究一些,我会让你知道我是如何使用它,但感谢帮助者! – IAE 2010-04-19 15:26:29

+0

除了我有一个语义错误('text :: npos'而不是'string :: npos',我刚刚纠正了),没有什么特别的语法。也许缩进让你感到困惑......这真的是一个简单的'for'循环。 – wilhelmtell 2010-04-20 22:07:42

+0

...和一个逻辑错误。在我发布之前,我应该真的测试我的代码。 :s – wilhelmtell 2010-04-20 22:12:13

1

使用分词器(例如listed here in section 7.3)将矢量中的字符串拆分为单个单词(或重写它以便它只返回标记的数量)并循环遍历矢量以计算您遇到的标记的总数。

+0

嘿Jiles!我已经开始阅读,我想过使用标记器,但是在查找strtok之前我发现了strchr,并且它更安全。我也会让你知道我是否可以用这个解决方案来回答它,因为我想把它们全部用作可能的答案,以便我可以尽可能多功能^^ – IAE 2010-04-19 15:30:09