假设我有一个数组:int list[] = {1, 2, 4, 5, 6};
我希望将数组从中间向右移动,并将3放在4的位置,这样看起来像:{1, 2, 3, 4, 5, 6}
我该怎么做?谢谢。
答案 0 :(得分:5)
如果您可以使用C ++标准库,那么std::vector
是数组的替代品。它有一个专门的方法insert
来做你想做的事情:
std::vector<int> v;
... // add elements 1, 2, 4, 5, 6 to it
v.insert(v.begin() + 2, 3); // insert 3 at position 2
如果您知道插入新元素的位置,这很好。但是,您的列表似乎应该始终排序,并且您希望插入新元素以使其保持排序。如果是这样,最好使用std::multiset
:
std::multiset<int> v;
... // add elements 1, 2, 4, 5, 6 to it
v.insert(3); // insert 3
在这里,您无需知道插入新元素的位置。
答案 1 :(得分:2)
如果你不能使用vector,一个解决方案是:
创建一个空间很大的数组(末尾有几个空位);
int * array = malloc(sizeof(int) * array_size);
使用两个变量一个来保存数组的大小(让我们称为size
)另一个来计算已经添加的元素数量(让我们称之为number_of_elements_in_the_array
)
在位置'x'处添加元素时,执行以下操作(使用x&lt;数组大小):
int tmp = array[x]; // save the current value
array[x] = new_value; // update with the new value
int tmp2;
number_of_elements_in_the_array++;
// we reach the limited
if(number_of_elements_in_the_array == size)
{
size = 2 * size; //lets double that size
int *new_array = malloc(sizeof(int) * size);
// copy the first elements
for(int i = 0; i <= x; i++)
new_array[i] = array[i];
new_array[x+1] = tmp;
// copy the last elements
for(int i = x+1; i < number_of_elements_in_the_array; i++)
new_array[i+1] = array[i];
free(array) // free the old space
array = new_array; // update the new pointer
}
else
{
// shift the remaining elements
for(int i = x+1; i < number_of_elements_in_the_array; i++)
{
tmp2 = array[i];
array[i] = tmp;
tmp = tmp2;
}
}
当你达到限制时,创建一个包含更多内存的新数组,从旧数组复制到新数组,并相应地更新变量number_of_elements_in_the_array
和size
。
免责声明:我没有测试过,因此它可能是一些小错误,但整体意识形态都存在。