cpp中vector<int> nums(n); 创建了全为0的长度为n的空数组,使用push_back会在0后面加入,如何解决?
时间: 2024-03-14 13:47:09 浏览: 57
如果想创建一个长度为n的空数组并且避免使用`push_back`时在0后面加入元素,可以将vector的大小设置为n,但是不进行初始化。这样就能够在vector末尾使用`push_back`添加元素而不会在0后面添加。
下面是示例代码:
```cpp
#include <iostream>
#include <vector>
int main() {
int n = 5;
std::vector<int> nums(n); // 创建了全为0的长度为n的空数组
nums.resize(n); // 将数组大小设置为n,但不进行初始化
nums.push_back(1); // 在数组末尾添加元素1
nums.push_back(2); // 在数组末尾添加元素2
for(int i=0; i<nums.size(); i++) {
std::cout << nums[i] << " "; // 输出数组中的元素
}
return 0;
}
```
在上面的代码中,我们首先创建了一个长度为n的空数组`nums`,其所有元素都是0。然后,我们使用`resize`将数组大小设置为n,但不进行初始化。这样,我们就可以在数组末尾使用`push_back`添加元素而不会在0后面添加。
最后,我们使用一个for循环遍历数组中的元素,并输出它们的值。输出结果为:`0 0 0 0 0 1 2`。
相关问题
#include <iostream> #include <vector> using namespace std; vector<int> temp; // 临时保存已经选择的数 // backtracking:回溯 void backtracking(vector<vector<int> > &res, vector<bool> &isused, vector<int> &nums) { // 当temp数组的长度等于期望数组的长度时 return if (temp.size() == nums.size()) { res.push_back(temp); return; } // 遍历所有选择 for (int i = 0; i < nums.size(); ++i) { // 对没有选择过的元素再进行抉择:选择它|不选择它 if (isused[i]) { // 选择该元素 选择后标记该元素为已选择 同时进行下一元素的抉择 temp.push_back(nums[i]); isused[i] = false; backtracking(res, isused, nums); // 回复原来状态:未选择 同时从temp中pop出 isused[i] = true; temp.pop_back(); } } } // permute:返回nums数组构成的全排列 vector<vector<int> > permute(vector<int> &nums) { vector<vector<int> > res; vector<bool> isused(nums.size(), true); backtracking(res, isused, nums); return res; } // 主函数 int main() { // 初始化nums=[1,2,3] vector<int> nums; for (int i = 1; i <= 3; ++i) { nums.push_back(i); } // 结果返回值 vector<vector<int> > ans; ans = permute(nums); // 打印结果 for (int i = 0; i < ans.size(); ++i) { for (int j = 0; j < ans[i].size(); ++j) { cout << ans[i][j] << " "; } cout << endl; } return 0; }
这段代码是一个求解给定数组的全排列的程序,使用了回溯算法来枚举所有可能的情况。
首先定义了一个全局变量temp来保存当前已经选择的数,然后定义了一个backtracking函数来进行回溯。在backtracking函数中,首先判断temp数组的长度是否等于nums数组的长度,如果相等,就将temp数组加入到结果数组res中,并返回。否则,遍历所有选择,对于每一个没有选择过的元素,进行选择或不选择的抉择。如果选择该元素,就将该元素添加到temp数组中,并标记该元素为已选择,然后进行下一元素的抉择。如果不选择该元素,就不对temp数组做任何操作,直接进行下一元素的抉择。在回溯回来之后,需要将当前的状态回复原来的状态,并从temp数组中pop出该元素。
permute函数是一个包装函数,用于调用backtracking函数,并返回最终的结果。
在主函数中,首先初始化nums数组,然后调用permute函数求解全排列,并将结果打印出来。
帮我改成可运行的c++程序:class Solution {public: vector<vector<int>> result; vector<int> path; void backtracking (vector<int>& nums, vector<bool>& used) { if (path.size() == nums.size()) { // 找到了一组排列(path.size表示递归深度) result.push_back(path); return; } for (int i = 0; i < nums.size(); i++) { if (used[i] == true) continue; // 第 i 个数字已经被占用,直接跳过 used[i] = true; path.push_back(nums[i]); backtracking(nums, used); path.pop_back(); used[i] = false; } } vector<vector<int>> permute(vector<int>& nums) { vector<bool> used(nums.size(), false); //used数组表示每个数字是否被占用 backtracking(nums, used); return result; } };
以下是可运行的C++程序:
```c++
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking (vector<int>& nums, vector<bool>& used) {
if (path.size() == nums.size()) {
result.push_back(path);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (used[i] == true) continue;
used[i] = true;
path.push_back(nums[i]);
backtracking(nums, used);
path.pop_back();
used[i] = false;
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> used(nums.size(), false);
backtracking(nums, used);
return result;
}
};
int main() {
Solution s;
vector<int> nums = {1, 2, 3};
vector<vector<int>> result = s.permute(nums);
for (int i = 0; i < result.size(); i++) {
for (int j = 0; j < result[i].size(); j++) {
cout << result[i][j] << " ";
}
cout << endl;
}
return 0;
}
```
注意:在使用时需要包含所需要的头文件(例如iostream和vector)。运行程序时会输出所有排列结果。
阅读全文