微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 sort() 或 unique() 不适用于 int 向量C++?

如何解决为什么 sort() 或 unique() 不适用于 int 向量C++?

sort() 和 unique() 不适用于这样一个简单的 int 向量。 欢迎提出任何建议。

std::vector<int>vec {33,25,11,44,22,20,12,33,59,87,23,53,26,97,32,43,44};
std::sort(vec.begin(),vec.end());
std::unique(vec.begin(),vec.end());

int nr = 1;
std::cout << std::endl;
for (auto p = vec.begin(); p!=vec.end(); p++){
    std::cout << *p << " ";
    if (!(nr++%4)) std::cout << std::endl;
}

返回:

11 12 20 22
23 25 26 32
33 43 44 53
59 87 97 44
44 53 59 87
97 21
请注意,数字既没有排序,也没有排除重复项(我标记为 44、53)。

**UPD:感谢贡献者,这是解决方案: 而不是

std::unique(vec.begin(),vec.end());

我们输入:

    auto last = std::unique(vec.begin(),vec.end());//returns an iterator to non-unique elements
    vec.erase(last,vec.end());// and kills them

解决方法

std::sort 工作正常。至于 std::unique - 它不会改变向量的大小,它只是在向量的开头创建一个子序列,其中包含所有不同元素的一个副本的序列。因此,正如您在自己的评论中指出的那样 - 您需要保持迭代器 std::unique 返回,并从向量的开头迭代到该结束迭代器。

,

使用 std::set 会更有益。

你可以只使用向量,排序+唯一方法

sort( vec.begin(),vec.end() );
vec.erase( unique( vec.begin(),vec.end() ),vec.end() );

你会得到这个回报

[1,10]      1.6821   
[1,1000]    5.0773  
[1,100000]  8.7955  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。