根据 C++14 标准表 100 \xe2\x80\x94 序列容器要求(除\n容器外)
\n该表达式a.assign(i,j)有一个前提条件,即i和j不是 a 的迭代器。自从
v1.assign(v1.begin() + 2, v1.begin() + 6);\nRun Code Online (Sandbox Code Playgroud)\n使用迭代器作为迭代器,v1因此您违反了该先决条件
如果要重置向量以包含子范围,则可以将这些元素复制到临时向量中,然后将该临时向量分配回主向量。这应该是移动操作(C++11 及更高版本),因此不会创建额外的副本。
\nv = std::vector<decltype(v)::value_type>(v.begin() + 2, v.begin() + 6);\nRun Code Online (Sandbox Code Playgroud)\n正如本杰明·林德利和巴里的评论中指出的那样,我们可以使用std::copy和移动迭代器,例如
std::copy(std::make_move_iterator(v.begin() + 2), std::make_move_iterator(v.begin() + 6), \n std::make_move_iterator(v.begin()));\nRun Code Online (Sandbox Code Playgroud)\n