假设我有一个整数向量 [1,2,3,4,5,6,7]。据我所知,向量有一个内存地址@v,然后如果我们想访问一个元素i,我们只需要执行@v+i*size_of_element。也许我错了, std::vector 是以不同的方式实现的。
如果我想删除前 4 个元素并最终得到 [5,6,7],我是否只需要更新 @v 并清除元素,在这种情况下它们只是整数,所以我假设它将是 O(1)。
我的假设是否错误,有什么方法可以使用向量在 C++ 中实现此目的,即更新向量的起始地址以“清除”前 n 个元素?
如果没有,是否可以使用 std::list ?
这在理论上是可能的,并且其他一些语言在数组上有类似的操作(例如Go 和 Rust 中的切片)。但是,std::vector
本身并不提供这样的功能。
无论使用哪种语言,您“删除”的元素永远不会真正从内存中消失,因为内存仍然被分配;最好的情况是,您可以获得底层数组的“视图”,该数组在开始或结束处省略了许多元素。
获得此类“视图”的 C++ 方法是使用一对迭代器。例如,my_vector.begin() + 4
,my_vector.end()
表示除前 4 个元素之外的所有元素(假设至少有 4 个)。所有std
在范围上运行的算法都接受迭代器对,这使得它成为一种有用的表示。
std::list
确实允许您从前面删除多个元素,但操作是 O( n ),其中n是删除元素的数量。这是因为每个元素都需要单独遍历和释放。