gpt4 book ai didi

c++ - std::unique_copy(或我对它的使用)有什么问题?

转载 作者:行者123 更新时间:2023-11-30 02:31:19 26 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

关于c++ - std::unique_copy(或我对它的使用)有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37929702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com