我大致有以下代码可以将唯一的段索引收集到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并错误地使用它?
答案 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。