Я пытаюсь переставить вектор с помощью рекурсии, но это приводит к ошибке сегментации (дампу ядра), что не так с кодом? идея заключается в использовании возврата, удаления и выбора строки для добавления к вектору, повторения и возврата.
#include <bits/stdc++.h>
#include <vector>
using namespace std;
// Function to print permutations of string
// This function takes three parameters:
// 1. String
// 2. vector to store string permutation
// 3. dummy vector to store each permutation
vector<vector<int> > permute(vector<int> nums, vector<vector<int> >& k, vector<int> li)
{
if (nums.empty()) {
k.push_back(li);
}
else {
for (int i = 0; i < nums.size(); i++) {
int chos = nums[i];
li.push_back(chos);
nums.erase(nums.begin() + i);
permute(nums, k, li);
nums.insert(nums.begin() + i, chos);
li.erase(li.end()-1);
}
}
return k;
}
// Driver Code
int main()
{
vector<int> permut = { 1, 2, 3 };
vector<vector<int> > k;
vector<int> li;
k = permute(permut, k, li);
return 0;
}
1 ответ
что не так с кодом?
Одна вещь, безусловно, неправильная в коде, это эта строка:
li.erase(li.end());
Вы вызываете erase
на итераторе end()
, что является неопределенным поведением.
Если вы хотите удалить последний символ, правильный способ сделать это:
if ( !li.empty())
li.erase(std::prev(li.end(), 1));
prev(li.end(), 1)
? li.end() - 1
подходит, или хотя бы prev(li.end())
.
prev(li.end())
всегда эквивалентен prev(li.end(), 1)
.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
#include <bits/stdc++.h>
-- Используйте правильные файлы заголовков, а не этот.li.erase(li.end());
-- Что вы пытаетесь здесь сделать?