0

我正在编写一个分词器,它会拆分 astring并将每个字段放入 avector中。我的想法是string::find反复使用。我没有使用临时string对象,而是使用了move_iterators,因为我认为原始字符串会在算法处理它时看到其字符被盗。但它没有发生。

这是一个示例代码,演示了我在说什么:

#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

4

1 回答 1

0

迭代器对容器一无所知。

Amove_iterator不能神奇地从字符串中移动。它不能只从其底层元素移动,这是一个单一的char,从 char 移动与复制它相同。你需要使用std::move(base).

#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' */

    std::cout << base << '\n'; // base is still untouched here

    v.emplace_back( std::move(base) ); // now it'll be moved from

    print_strings( v );
    std::cout << "base: " << base << "/base\n"; // base is empty
    return 0;
}

看到它住在这里

于 2013-08-23T16:44:44.407 回答