【发布时间】:2011-04-15 08:16:52
【问题描述】:
如何插入和删除一维数组的元素。
例如:
假设数组是:1 3 4 2 5
我们想在 3 和 4 之间插入 7,这样新的数组就是:1 3 7 4 2 5
【问题讨论】:
标签: c++
如何插入和删除一维数组的元素。
例如:
假设数组是:1 3 4 2 5
我们想在 3 和 4 之间插入 7,这样新的数组就是:1 3 7 4 2 5
【问题讨论】:
标签: c++
使用 std::vector 而不是 C 样式的数组。
【讨论】:
std::list 慢。
std::vector 也经常获胜(这通常归因于其数据的更高局部性,这应该与处理器缓存更好地配合)。好吧,这至少适用于 C++。我不知道它是否也适用于解释和/或特征 GC 的语言。
当您想要插入或删除一个元素时,数组不是很容易处理。您必须手动将数据向前复制 1 个位置以插入 1 个元素以使新插槽可用。
要减少工作量,您可以使用 STL 向量:
#include <vector>
//...
std::vector<int> v;
v.push_back(1);
v.push_back(3);
v.push_back(4);
v.push_back(2);
v.push_back(5);
v.insert(v.begin() + 2, 7);
v.erase(v.begin());//Removing the first element just for fun
即使使用矢量,您仍在复制数据(只是对您透明)。因此,要最有效地执行此操作,您将使用std::list。
#include <list>
//...
std::list<int> v;
v.push_back(1);
v.push_back(3);
v.push_back(4);
v.push_back(2);
v.push_back(5);
v.insert(++(++v.begin()), 7);
v.erase(v.begin());//Removing the first element just for fun
【讨论】:
您不能在 C++ 中对数组执行此操作——您必须重新分配数组并移动元素。改用std::vector 和insert 方法:
std::vector<int> v;
v.push_back( 1 );
v.push_back( 3 );
v.push_back( 4 );
v.push_back( 2 );
v.push_back( 5 );
// begin() yields an iterator to the first element; since it's a random-access
// iterator we can offset to insert at index 2.
v.insert( v.begin() + 2, 7 );
erase 可以以类似的方式用于删除项目。
【讨论】:
如果你想插入元素,那么使用列表会更合适——数组是连续的内存块,所以如果你想插入一些东西,你必须做一些工作:
increase the size of the array
for each element past the spot - move one element further back
write new element at the target position
【讨论】: