0

所以这应该拆分字符串并将其转换为列表:

std::list<std::string> strSplit(std::string::iterator begin, std::string::iterator end, char c) {
    while(std::find(begin, end, c) != end) *std::find(begin, end, c) = '\0';
    return std::list<std::string>(begin, end);
}

但是编译器会抛出这个错误:

Error: C2664    
'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string
(const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &)':
 cannot convert argument 1 from 'char' to 'std::initializer_list<_Elem>'

并双击重定向到 xmemory0 行:881

...
template<class _Objty,
class... _Types>
static void construct(_Alloc&, _Objty * const _Ptr, _Types&&... _Args)
{   // construct _Objty(_Types...) at _Ptr
::new (const_cast<void *>(static_cast<const volatile void *>(_Ptr)))
    _Objty(_STD forward<_Types>(_Args)...);
}
...
4

2 回答 2

0

您的功能有多个问题。除了不编译. 它试图改变它试图复制到列表中的字符串,这是没有意义的。它还std::find无缘无故地多次使用,而不是存储其结果并重用它。这是我的版本:

std::list<std::string> strSplit(std::string::const_iterator const begin,
                                std::string::const_iterator const end,
                                char const c) {
  std::list<std::string> res;
  if (end != begin) {
    auto it = begin, prev = begin;
    while ((it = std::find(it, end, c)) != end) {
      res.emplace_back(prev, it);
      prev = ++it;
    }
    res.emplace_back(prev, end);
  }

  return res;
}
于 2020-11-04T20:56:21.887 回答
0

您需要使用从中获得的返回迭代器std::find并实际从中创建一个std::string(和begin迭代器)。替换c\0只会使原始字符串包含\0在其中,因此结果中的唯一字符串std::list<std::string>也会看起来像。

关于那个主题 - 你可能应该使用std::string::const_iterator它,因为你可能不应该对原始字符串进行更改。

例子:

#include <iterator>

std::list<std::string> strSplit(std::string::const_iterator begin,
                                std::string::const_iterator end, char c) {
    std::list<std::string> retval;
    if(begin == end) return retval; // nothing to do here

    while(true) {
        auto fit = std::find(begin, end, c);
        retval.emplace_back(begin, fit); // creates a string in-place using begin and fit
        if(fit == end) return retval;    // if end was found, return what we got        
        begin = std::next(fit);          // else, go another round
    }
}
于 2020-11-04T20:47:06.513 回答