如何从一组中取出一个字符串

时间:2014-03-15 01:09:56

标签: c++ string

有没有人知道如何从一个集合中取出一个字符串然后将该字符串初始化为一个新变量?例如,假设您在列表的开头有“Hello world”,然后是“hello baby”。如何将“Hello world”行放在一个新的字符串变量中?这是我制作的代码(尝试从一组行中获取独特的单词):

2 个答案:

答案 0 :(得分:1)

这个怎么样?

#include <iostream>
#include <iterator>
#include <algorithm>
#include <set>
using namespace std;

template <typename InIt> set<string> TokenSet(InIt begin, InIt end)
{
    static const string chars = { ' ', '\f', '\n', '\r', '\t', '\v', '\0' };

    set<string> result;
    string::size_type pos1, pos2;

    for (; begin != end; begin++)
    {
        const string &str = *begin; // If InIt doesn't refer to string, compile error will occur
        pos1 = 0;
        while (1)
        {
            pos2 = str.find_first_of(chars, pos1);
            result.insert(str.substr(pos1, pos2 - pos1));
            if (pos2 == string::npos)
                break;
            pos1 = str.find_first_not_of(chars, pos2);
        }
    }
    return result;
}

int main()
{
    set<string> source = { "Hello world", "Hell world", "Hello guys" };
    set<string> out = TokenSet(source.begin(), source.end());
    copy(out.begin(), out.end(), ostream_iterator<string>(cout, " "));
}

输出:

Hell Hello guys world

答案 1 :(得分:0)

这是一个重写版本。我认为这与你的原作大致相同,但更简单,更有希望更清楚。一旦它像这样被重构,很明显,一旦找到它们之间的空白,你就忘记实际上打破了字符串。你有.substr()没有参数,这绝对不是你想要的。

所以不要认为这是代码的固定版本,而是一种了解如何修复代码的方法。

// split inPhrases on whitespace, add each word to outWords
// return total size of outWords (including anything that was there before)
size_t countUniqueWords(const set<string>& inPhrases, set<string>& outWords)
{
  for (set<string>::iterator it = inPhrases.begin(); it != inPhrases.end(); it++)
  {
    for (size_t ii = 0; ii < it->size(); ii++)
    {
      if (!isspace((*it)[ii]))
      {
        outWords.insert(*it);    
      }
    }
  }
  return outWords.size();
}