std :: unique_copy(或我使用它)有什么问题?

时间:2016-06-20 18:48:19

标签: c++ stl std standard-library c++-standard-library

我大致有以下代码可以将唯一的段索引收集到uniques

    vector< int > segments;
    // segments vector is filled in here
    // ...
    sort( segments.begin(), segments.end() );
    vector< int > uniques;
    uniques.reserve( segments.size() );
#ifdef USE_STD_UNIQUE_COPY
    unique_copy( segments.begin(), segments.end(), uniques.begin() );
#else
    if( segments.size() > 0 )
        uniques.push_back( segments[ 0 ] );
    for( size_t i = 1; i < segments.size(); ++i)
    {
        if( segments[ i ] != uniques.back() )
            uniques.push_back( segments[ i ] );
    }
#endif

定义USE_STD_UNIQUE_COPY时代码失败;当它未定义时,它按预期工作。整个部分在多个线程上运行,我还没有调试std::unique_copy输出的确切差异。无论如何,根据cppreference std::unique_copy (1)应该完全符合代码的#else部分。

因此问题:这张照片中有什么错误? std::unique_copy是否有限制,可能不是线程安全的?或者我可能误读了cppreference并错误地使用它?

1 个答案:

答案 0 :(得分:3)

问题是您正在尝试复制到无效的目标范围。从本质上讲,您对reserve的调用会分配向量所需的空间,但实际上并不会更改其大小。所以你不能直接复制到它的元素。您的替代代码有效,因为对push_back的调用将向量大小扩展为1并追加到末尾。

正如评论中已经指出的那样,无论如何都有一种聪明的方法来使用unique_copy。您将其更改为使用back_inserter作为目标范围。

unique_copy(segments.begin(), segments.end(), back_inserter(uniques)); 

back_inserter创建一个back_insert_iterator,当复制到它时,调用容器上的push_back。