【发布时间】:2016-10-22 03:11:28
【问题描述】:
我大概有以下代码应该将唯一的段索引收集到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 并错误地使用了它?
【问题讨论】:
-
s/uniques.begin()/back_inserter(uniques)/ -
reserve!=resize。所以你的unique_copy是错误的,或者你应该使用back_inserter -
@Arunmu 你是在暗示向量的
random_access_iterator不是output_iterator? -
@Arunmu 你不能? coliru.stacked-crooked.com/a/4cff3ac18bd39ec4
-
@Arunmu 我明白你在说什么,但情况并非如此。它们只是这里的模板名称,用于尝试执行一个概念。根据标准,没有标签或硬性要求。只要容器有空间,任何迭代器都可以工作。如果它没有空间,那么你需要像
back_inserter这样的东西来为你创建它。
标签: c++ stl std standard-library c++-standard-library