数组初始化vector 倒序
时间: 2024-12-16 15:13:17 浏览: 34
在C++中,如果你想要初始化并倒序一个`std::vector`,你可以这样做:
```cpp
#include <iostream>
#include <vector>
#include <algorithm> // 包含sort函数
int main() {
std::vector<int> vec = {5, 3, 8, 1, 9}; // 初始化一个整数向量
// 首先对vector进行排序,这里我们按降序排列
std::sort(vec.rbegin(), vec.rend()); // 使用reverse_iterator进行倒序
// 现在vec就是倒序的
for (const auto& num : vec) {
std::cout << num << " ";
}
std::cout << "\n";
return 0;
}
```
在这个例子中,`vec.rbegin()`返回一个reverse_iterator,它从向量的末尾开始向前遍历,而`vec.rend()`则指向向量的第一个元素。`std::sort`函数会按照这个逆序迭代器进行操作,实现倒序的效果。
相关问题
数组反转reserve怎么用
`std::vector` 的 `reserve()` 函数是用来预分配内存空间的,用于在你知道将要添加大量元素到容器之前避免频繁的动态内存扩展。当你需要确保数组(在这种情况下指的是 `std::vector`)有足够的容量来容纳元素而不想频繁地进行内部扩容时,你可以使用这个函数。
如果你想要反转一个已经存在的数组(而不是 `std::vector`),`reserve()` 是不必要的,因为数组的大小一旦初始化就固定了。然而,如果你打算先使用 `reserve()` 确保足够的空间,然后创建一个新的倒序数组,你可以这样做:
```cpp
#include <vector>
int main() {
std::vector<int> original_array({1, 2, 3, 4, 5});
size_t original_size = original_array.size();
// 预留空间以存储原始数组的元素
original_array.reserve(original_size);
std::reverse(original_array.begin(), original_array.end()); // 反转数组
// 创建新的倒序数组,不需 reserve,因为它基于原数组长度
std::vector<int> reversed_array(original_array.rbegin(), original_array.rend());
return 0;
}
```
在这个例子中,`reserve()` 不直接作用于数组反转,但确保了足够空间以便后续创建倒置版本的数组。`reversed_array` 利用了 C++ 标准库中的范围基元,创建了一个从原数组末尾向前的迭代器序列。
别用动态数组,简单些
### 蜜蜂路线问题的简单C++解决方案(不使用动态数组)
蜜蜂路线问题可以通过递推公式解决,其核心是斐波那契数列的变种。以下是一个不使用动态数组的简单C++实现方案。
#### 算法思路
1. 定义一个固定大小的数组来存储高精度结果,避免使用动态数组。
2. 使用两个变量分别存储前两项的结果,并通过迭代计算后续项。
3. 在每次计算中,更新这两个变量以保存最新的前两项值。
4. 由于结果可能非常大,采用逐位存储的方式处理高精度数字。
以下是完整的C++代码实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 高精度加法函数
vector<int> add(const vector<int>& a, const vector<int>& b) {
vector<int> result;
int t = 0; // 进位
for (int i = 0; i < a.size() || i < b.size(); ++i) {
if (i < a.size()) t += a[i];
if (i < b.size()) t += b[i];
result.push_back(t % 10);
t /= 10;
}
if (t) result.push_back(t); // 处理最后的进位
return result;
}
int main() {
int m, n;
cin >> m >> n;
// 初始化高精度数组
vector<int> prev1 = {1}; // dp[1]
vector<int> prev2 = {2}; // dp[2]
vector<int> current;
// 如果差值小于等于2,直接输出结果
if (n - m + 1 == 1) {
cout << 1 << endl;
return 0;
}
if (n - m + 1 == 2) {
cout << 2 << endl;
return 0;
}
// 计算从第3项到第(n-m+1)项
for (int i = 3; i <= n - m + 1; ++i) {
current = add(prev1, prev2); // 当前项等于前两项之和
prev1 = prev2; // 更新prev1为prev2
prev2 = current; // 更新prev2为current
}
// 输出结果
for (int i = current.size() - 1; i >= 0; --i) {
cout << current[i];
}
cout << endl;
return 0;
}
```
#### 代码说明
1. **高精度加法**:函数 `add` 实现了两个高精度数字的逐位相加操作[^4]。
2. **初始化**:`prev1` 和 `prev2` 分别初始化为 `[1]` 和 `[2]`,表示初始的两项。
3. **迭代计算**:通过 `for` 循环完成从第3项到第 `(n-m+1)` 项的计算。
4. **结果输出**:将最终的高精度结果倒序输出。
此算法的时间复杂度为 \(O(N)\),空间复杂度为 \(O(1)\)(固定大小的高精度数组)[^4]。
---
阅读全文
相关推荐
















