Copy part of a string directly to vector error: no match operator=

Copy part of a string directly to vector error: no match operator=

我想实现一个简单的函数,它将根据分隔符 ,\s.

拆分 std::string

例如,split("Emerson, Lake, Palmer") 应该产生 std::vector<std::string> of

Emerson
Lake
Palmer

我发现,可以用 back_inserter() 简单地实现它(这个例子很有帮助)。下面的函数迭代提供的字符串并将其内容直接复制到向量中。

std::vector<std::string> split(const std::string& s) {
    std::vector<std::string> tokens;

    std::string::const_iterator from = s.begin();
    for (std::string::const_iterator it = s.begin(); it < s.end(); it++) {
        if ( *it == ',' ) {
            std::copy(from, it, std::back_inserter(tokens));
            from = it + 2;
        }
        if (it == s.end()-1)
            std::copy(from, it+1, std::back_inserter(tokens));
    }
    return tokens;
}

但是,代码没有编译错误

no match for 'operator=' (operand types are 'std::back_insert_iterator<std::vector<std::__cxx11::basic_string<char> > >' and 'const char')

大致明白是什么意思,但是不知道怎么办。我是不是错过了一些简单的东西来让它发挥作用,或者整个概念都不是可行的方法?

当您将一个范围作为 2 个迭代器提交给 std::copy() 时,您的意思是您想要将此类迭代器指向的每个元素复制到目标。但是 std::string::iterator 指向单个字符,我认为您不想将每个符号分别复制到向量中。相反,您可以从对创建 std::string 并将其提交给向量:

for (std::string::const_iterator it = s.begin(); it < s.end(); it++) {
    if ( *it == ',' ) {
        tokens.emplace_back( from, it );
        from = it + 2;
    }
...

在此声明中

std::copy(from, it, std::back_inserter(tokens));

来自的迭代器提供 char 类型的对象,而类型 std::back_inserter 的迭代器需要 std::string.

类型的对象

相反,您至少可以写

tokens.push_back( std::string( from, it ) );

tokens.push_back( { from, it } );