c++ - 哪种 C++ 数据结构可以像 Java ArrayList 一样处理 'insert'?

标签 c++ arrays vector arraylist iterator

我正在尝试将 Java 项目转换为 C++ 项目。在Java项目中,我使用了ArrayList,但我不知道处理我在C++中所做的事情的最佳方法。

目前我正在使用 std::vector 因为它允许访问任意位置的元素,并且因为它有一个插入方法。像 Java ArrayList 一样,我希望能够在 vector 中的某个位置 (int p) 插入一个元素,并将当前位于 p 的元素(如果有)移动到 p+1。后续元素也会发生变化。

单个条目的 std::vector.insert 如下所示:

iterator insert (iterator position, const value_type& val);

以及 http://www.cplusplus.com/reference/vector/vector/insert/ 的描述说

Because vectors use an array as their underlying storage, inserting elements in positions other than the vector end causes the container to relocate all the elements that were after position to their new positions.

这是否意味着 insert 实际上将新元素放在 p+1 而不是 p 处?它不会同时移动当前位于 p 的元素吗?

另外,为什么 insert 方法接受迭代器而不只是数字索引?我看不出有什么优势。它只会使插入任意位置变得更加困难。有没有某种方法可以构造一个位于特定位置的迭代器,而不必在那里进行迭代?我只在http://www.cplusplus.com/reference/iterator/RandomAccessIterator/处看到比较

最佳答案

vector 完全符合您的需要,但边界条件有点不同。

你给它的迭代器指向你想要在之前插入的元素。

换句话来说,如果你向它传递一个指向第一个元素的迭代器,那么它将在 vector 的开头插入新元素,并推送之前的元素 从第一个到第二个位置。

Also, why does the insert method take in an iterator instead of just a number index? I don't see the advantage. It just makes it more difficult to insert at arbitrary positions. Is there some way to construct an iterator to be at a specific location without having to iterate there?

为什么比较难?

要获取指向第 17 个元素的迭代器,请执行以下操作:

vec.begin() + 17;

我不知道“必须在那里迭代”是什么意思,但您不需要将迭代器增加 17 次。

关于c++ - 哪种 C++ 数据结构可以像 Java ArrayList 一样处理 'insert'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15712551/

相关文章:

c++ - 线程之间通过共享 vector 进行通信

java - 文件输入到 arrayList 中。用于创建新对象的相同 arrayList

c++ - 如何将 std::array 转换为 std::vector?

c++ - 在 std::vector 中找到满足条件的最后一个元素

c++ - 使用 Image.ptr<double>(0);在 OpenCV 中使用彩色图像

c++ - C11 编译。翻译阶段 #1 和 #5。通用字符名称

c++ - 如何修改 CUDA 代码以获得 100% GPU 负载

java - 我的java数组代码有什么问题?

javascript - 如何在 Javascript 中创建具有随机 x 和 y 坐标的对象列表?

r - 使用df [col]访问列给出:错误 'x'对于 'sort.list'必须是原子的