2

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

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

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

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

和来自http://www.cplusplus.com/reference/vector/vector/insert/的描述说

因为向量使用数组作为其底层存储,所以在向量末端以外的位置插入元素会导致容器将位置之后的所有元素重新定位到它们的新位置。

这是否意味着插入实际上将新元素放在 p+1 而不是 p?它是否也不会移动当前位于 p 的元素?

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

4

1 回答 1

3

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

The iterator you give it points to the element you want to insert before.

In other wirds, if you pass it an iterator pointing to the first element, then it will insert the new element at the start of the vector, and push the element that was the first to the second position.

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?

Why is it more difficult?

To get an iterator pointing to the 17th element, do this:

vec.begin() + 17;

I don't know what you mean by "having to iterate there", but you don't need to increment the iterator 17 times.

于 2013-03-29T22:51:16.037 回答