Возникла проблема. Есть вектор чисел arr, к примеру
{1, -1, -1, 2, -2, 1, 1}.
Нужно написать функцию которая примет этот вектор и удалит противоположные по знаку элементы если они стоят рядом. Написал вот такой код, но ничего не выходит. Должно вернуть 1, а возвращает -2, почему? Может кто знает решение лучше?
arr - начальный вектор
result_vec - результирующий вектор, в начале равен arr
#include<string>
#include<iostream>
#include<vector>
std::vector<int> someFunc(std::vector<int>& arr);
int main() {
std::vector<int> d1 = { 1, -1, -1, 2, -2, 1, 1 };
std::vector<int> ans1 = someFunc(d1);
for (int x : ans1) {
std::cout << x << " "; // вывод результата
}
system("pause");
return 0;
}
std::vector<int> someFunc(std::vector<int>& arr)
{
std::vector<int> result = arr;
// проход по элементам массива
for (int i = 0; i < arr.size(); i++) {
for (int j = 0; j < result.size() - 1; j++) { // здесь использую проход по result, т.к. каждый раз его размер уменьшается
if ((arr[j] == -1 * arr[j + 1])) {
result.erase(result.begin() + j);
result.erase(result.begin() + j);
}
}
}
return result;
}
Не самый эффективный вариант, но тем не менее
#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>
int main()
{
std::vector<int> a = { 1, -1, -1, 2, -2, 1, 1 };
auto p = [](int a, int b) { return a == -b; };
std::vector<int>::iterator it;
while ((it = std::adjacent_find(a.begin(), a.end(), p)) != a.end())
do
{
it = a.erase(it, it + 2);
it = std::adjacent_find(it, a.end(), p);
} while (it != a.end());
std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости