在不同类型的向量上使用 std::remove 的不同结果
Different results with std::remove on vectors of different types
正如标题所解释的那样,出于某种原因,我在不同类型的向量(即字符串和整数(上使用 std::remove 得到了不同的结果。对于 ints 的向量,该函数按预期工作,而不是实际物理删除元素。但是,它确实物理上删除了字符串向量的元素,我似乎无法弄清楚为什么(感觉这是我忽略的小东西(。如果有人能解释为什么会发生这种情况,那就太好了。我已经在下面发布了代码和输出。谢谢!
//includes
using namespace std;
template <class T>
void printer(T value) {
cout << value << ", "
}
int main() {
string myvalues[] = { "yyy","Yyy", "yYy","yyY","ZZZ","zZZ", "ZzZ", "ZZz" };
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
vector<string> v1(myvalues, myvalues + 8);
vector<int> v2(nums, nums + 8);
sort(v1.begin(), v1.end());
remove(v2.begin(), v2.end(), 7);
remove(v1.begin(), v1.end(), "yyy");
for_each(v1.begin(), v1.end(), printer<string>);
cout << endl;
for_each(v2.begin(), v2.end(), printer<int>);
return 0;
}
输出:
年, ZZZ, ZZz, ZzZ, yYy, yyY, zZZ, , ,
1, 2, 3, 4, 5, 6, 8,8,
如您所见,元素"yyy"实际上已被删除,最后一个元素为空,而元素"7"在逻辑上被删除,最后一个元素保持不变。
来自 std::remove:
保留未删除元素的相对顺序,而 返回的迭代器和 last 之间的元素保留在有效的 但未指定的状态。
因此,在这两种情况下,函数的行为都是"正确"的。
相关文章:
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 使用容器中元素的别名删除带有 std::list::remove 的元素是否正确?
- C++代码"x.erase(std::remove(x.begin(), x.end(), ), x.end())"是如何工作的?
- std::remove, std::move(range) and moved-from elements
- 在不同类型的向量上使用 std::remove 的不同结果
- 为什么 std::remove 不删除数组的最后一个元素
- std::remove 和 std::remove_if 设计的稳定性是否失败
- std::unordered_map:渐近{search,insert,remove}性能取决于密钥的大小和数据类型
- std::remove 不起作用
- 为什么std::whatever::erase()是一个方法,std::remove()是独立函数
- std::erase 和 std::remove 组合以删除特定元素不适用于特定示例
- std::remove函数中的转换错误
- std::list.remove 正在调用析构函数,但不删除它
- 如何在 c++ 中使用 std::remove'd 字符串?
- 使用 std::erase 和 std::remove 从矢量中删除元素,不使用自定义结构作为值
- vector.erase 和 std::remove 在自定义向量上
- 需要了解 std::remove with vector.erase
- std::按索引列出remove元素
- 为什么std::remove不能和std::set一起工作
- 如何为std::list重载std::remove