#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int MaxPairwiseProduct(vector<int>& numbers);
//declaration
vector<int> *x;
x->push_back(1);
x->push_back(2);
int answer = MaxPairwiseProduct(*x);
cout << answer;
}
int MaxPairwiseProduct(vector<int>& numbers) {
int index1 = 1;
int index2;
//vector<int> numbers = number;
int n = numbers.size();
for(int i = 2;i < n;++i){
if (numbers[i]>numbers[index1]){
index1 = i;
}
}
if (index1 == 1){
index2 = 2;
} else {
index2 = 1;
}
for(int i = 1;i < n;++i){
if (numbers[i] != numbers[index1] && numbers[i]>numbers[index2]){
index2 = i;
}
}
numbers[index1] * numbers[index2];
return numbers[index1] * numbers[index2];
}
Я пытаюсь реализовать, казалось бы, продвинутый алгоритм, чтобы найти максимальный попарный продукт. Я продолжаю получать ошибки Segmentation fault (core dumped), и я знаю, что это как-то связано с моими указателями и, возможно, объемом моих функций. Какие-нибудь советы или подсказки?
До нашей эры. Я могу догадаться, лол, хочу убедиться, что помню управление памятью в C++. Как мне инициализировать его действительным экземпляром?
Лучшим способом было бы вообще не использовать указатель: vector<int> x;
и заменить стрелки разыменования ->
на .
, а также опустить *
при передаче его другой функции.
Я сделал то же самое, и теперь получаю 0 как ответ, который является ложным.
Это, наверное, другая проблема. Я бы порекомендовал вам запустить свой код в отладчике и пошагово выполнять его построчно.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int MaxPairwiseProduct(vector<int>& numbers);
//declaration
vector<int> *x = new vector<int>();
x->push_back(7);
x->push_back(4);
x->push_back(5);
x->push_back(6);
int answer = MaxPairwiseProduct(*x);
cout << answer;delete x;
}
int MaxPairwiseProduct(vector<int>& numbers) {
int index1 = 1;
int index2;
//vector<int> numbers = number;
int n = numbers.size();
for(int i = 0;i < n;++i){
if (numbers[i]>numbers[index1]){
index1 = i;
}
}
if (index1 == 1){
index2 = 2;
} else {
index2 = 1;
}
for(int i = 0;i < n;++i){
if (numbers[i] != numbers[index1] && numbers[i]>numbers[index2]){
index2 = i;
}
}
return numbers[index1] * numbers[index2];
}
Я заставил это работать там был странный ночной пердун мозга.
Привет - добро пожаловать в stackoverflow! Ваш код выглядит хорошо. Я просто хотел добавить, что вам не нужно создавать x
как указатель на вектор. Использование его в качестве вектора будет работать нормально, и тогда вам не нужно будет вызывать delete
в конце. Он будет выглядеть как vector<int> x = vector<int>();
или, альтернативно, vector<int> x{}
.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
long MaxPairwiseProductFast(vector<long>& numbers);
long N, input;
vector<long> *V = new vector<long>();
cin >> N;
do {
V->push_back(input);}
while (V->size() <= N && cin >> input);
long answer = MaxPairwiseProductFast(*V);
cout << answer;
delete V;
}
long MaxPairwiseProductFast(vector<long>& numbers) {
int index1 = 1;
int index2 = 1;
int n = numbers.size();
for(int i = 2;i < n;++i){
if (numbers[i]>numbers[index1]){
index1 = i;
}
}
if (index1 == 1){
index2 = 2;
} else {
index2 = 1;
}
for(int i = 2;i < n;++i){
if (i != index1 && numbers[i]>numbers[index2]){
index2 = i;
}
}
return (long)(numbers[index1] * numbers[index2]);
}
long MaxPairwiseProduct(vector<long>& A) {
int index = 1;
int n = A.size();
for(int i = 2; i < n; ++i){
if (A[i] > A[index]){
index = i;
}
}
swap(A[index], A[n]);
index = 1;
for (int i = 2; i < n-1; ++i){
if (A[i] > A[index]){
index = i;
}
}
swap(A[index], A[n - 1]);
return A[n-1] * A[n];
}
Модифицированная версия с определяемым пользователем размером вектора и возможностью определять вводимые пользователем значения.
vector<int> *x;
ваш векторный указатель никогда не инициализируется действительным экземпляром. Почему вы вообще используете там указатель?