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 } );
我想实现一个简单的函数,它将根据分隔符 ,\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 } );