C++. Циклы и удаление элементов из вектора

293
25 марта 2017, 01:42

Возникла проблема. Есть вектор чисел 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;
}
Answer 1

Не самый эффективный вариант, но тем не менее

#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;
}
READ ALSO
Подключить clang++ к clion

Подключить clang++ к clion

Как подключить компилятор clang++ к Clion на Windows? Параметром для cmake, как написано в туториале, компилятор не проходит тестПроблема в том, что в cmake кэше...

340
Вызов глобальной функции

Вызов глобальной функции

Сразу скажу, что пишу не на обычном C++, а под микроконтроллер AVR, но я думаю, что в этом плане никаких отличий нетЕсть файл main

311
Завершение дочернего процесса QProcess

Завершение дочернего процесса QProcess

Как можно средствами Qt4 автоматически "убивать" запущенные дочерние процессы при падении основной программы? PS

253