C++调用std::unique后vector元素打印缺失问题咨询
问题原因解答
std::unique仅对序列内的元素做移动去重,不会修改容器的大小:它会把相邻的重复元素移动到序列尾部,返回去重后有效区间的尾后迭代器,这就是你调用.size()得到结果始终为10的原因。- 去重完成后,返回迭代器之后的尾部元素处于有效但未指定的状态:对于
std::string这类支持移动语义的类型,std::unique内部会使用移动赋值处理元素,被移动走内容的原字符串会变为空字符串,空字符串打印时没有可见内容,就会造成元素缺失的错觉,实际元素数量没有变化。
你输入的10个参数排序后顺序为:
fox, jumps, over, quick, red, red, slow, the, the, turtle
std::unique处理后,前8个为去重后的有效元素,尾部剩下的2个元素为被移动后的空字符串(不同标准库实现可能有差异,但一定包含无可见内容的空项),你数到的9个可见元素,是因为尾部的空字符串仅显示为一个空格,和元素之间的分隔空格混在一起无法区分。
验证方案
修改遍历打印逻辑,给每个元素加上边界标识,就能看到完整的10个元素:
for ( const auto &el : words ) std::cout << "\"" << el << "\" "; std::cout << std::endl;
这种尾部的未指定状态元素,后续调用words.erase(end_unique, words.end())即可安全清除,和《C++ Primer》中介绍的标准去重写法逻辑完全一致,不会影响程序正常功能。
内容的提问来源于stack exchange,提问作者tb711
相关产品推荐
相关产品推荐

