在数组的开头添加一个元素并移动其余元素,但保留大小
Add an element at the beginning of an array and shift the rest but keep the size
我需要按照以下格式创建一个向量/数组:
arr[10] = [1, 2, 3, 4, 5, 6, 7, 8, 9 ,10]
我想在开头添加一个新元素,之后所有元素都向右移动并删除最后一个元素。结果应该是:
arr[10] = [new_int, 1, 2, 3, 4, 5, 6, 7, 8, 9]
如何在 c++ 中执行此操作?我是否必须编写一个函数,或者已经有一个现有的函数,如 .append 或 .pushback?
如果是std::vector
,简单的解决方案是:
vec.pop_back();
vec.insert(vec.begin(), new_int);
渐近复杂度与任何其他方法相同(pop_back()
是O(1(,insert
是O(n(,没有执行过重新分配(,但它无缘无故地暂时触及向量长度,并且总体上做了更多的记账。
一个更好的解决方案(对于std::vector
、std::array
和C样式数组都很好(是:
std::copy_backward(std::begin(vec), std::end(vec)-1, std::begin(vec)+1);
vec[0] = new_int;
同样,这应该具有 O(n( 复杂性,但"偏移量"较小(它完全执行它需要做的事情,仅此而已(。
现在,如果我们转向不同的数据结构,情况就不同了;有了std::deque
,你可以按照@JesperJuhl在他的回答中显示的那样做;在deque
的两端推动/弹出成本摊销O(1(,所以对于大多数用途来说,它相当快。
不过,如果你的缓冲区大小是固定的,通常你描述的操作的自然数据结构是固定大小的循环缓冲区;它不是由标准库提供的,但在 Boost 中有一个实现(此外,自己编写它也是一个很好的练习,使用迭代器和所有东西(。
#include <algorithm>
#include <iterator>
...
std::rotate( std::begin(arr), std::end(arr)-1, std::end(arr));
arr[0] = new_int;
最简单的方法是使用std::deque
。然后它变得像
my_deque.pop_back(); // get rid of last element.
my_deque.push_front(42); // put the new element at the front
您可以使用push
和pop
vector
。如果你想使用数组来做到这一点,那么你可以:
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9 ,10};
int new_value = 20;
for(int i(0); i < 10 - 2; i++){
arr[i + 1] ^= arr[i];
arr[i] ^= arr[i + 1];
arr[i + 1] ^= arr[i];
}
或者,您可以使用临时变量而不是运算符XOR
:
/*
int tmp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = tmp;
*/
arr[0] = new_value;
for(int i = 0; i < 10; i++)
std::cout << arr[i] << ", ";
std::vector<int> arr;
arr.insert(arr.begin(), newvalue);
arr.pop_back();
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何与元素进行元素比较
- 在查找子集中元素和元素数量之间的二进制比较背后的逻辑是什么?
- 并行算法将向量的元素分配到另一个元素的元素
- 为什么我要获得元素填充元素的零长度
- 如何删除 QStringList 中的冗余元素
- 如何在 MFC 中访问主对话框的元素?元素是在可视化编辑器VS 2012中创建的
- 指向列表中元素VS元素本身的指针