我正在编写一个分词器,它会拆分 astring
并将每个字段放入 avector
中。我的想法是string::find
反复使用。我没有使用临时string
对象,而是使用了move_iterator
s,因为我认为原始字符串会在算法处理它时看到其字符被盗。但它没有发生。
这是一个示例代码,演示了我在说什么:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
void
print_strings
( const vector<string> & v )
{
unsigned int i = 1;
for ( const auto & s : v )
cout << "#" << i++ << "\t: \"" << s << "\"" << endl;
return;
}
int
main
( void )
{
string base( "hello, this is an example string, I like icescreams" );
/* Vector to populate with strings */
vector<string> v;
/* 1: a copy of 'base' */
v.emplace_back( base );
/* 2: a copy of 'base' using iterators */
v.emplace_back( base.begin() , base.end() );
/* 3: a string that I think _should_ move from 'base' */
v.emplace_back( make_move_iterator(base.begin()) , make_move_iterator(base.end()) );
/* Print the strings twice so that we
* can see if something has changed. */
print_strings( v );
print_strings( v );
return 0;
}
使用 编译时g++ -std=c++11 -Wall -Wextra -Werror -O2
,它不会显示任何警告。
我的猜测是string
,在其范围版本中,构造函数总是从指定范围复制。由于我不确定,我想确定,当然,看看您使用过的任何解决方法。
最好的问候, Kalrish