Jak usunąć wartość z wektora?

0

Problem z jakim nie mogę sobie dać rady jest następujący:
Mam na wejściu ilość testów, plus dla każdego testu liczbę punktów i konkretne pary liczb (a,b), powiedzmy, że oznaczymy te zmienne:

int testy = 0;
int liczba_punktow = 0;
long int a,b;
  1. I teraz muszę sprawdzić maksymalną i minimalną wartość dla każdego testu z liczb a i z liczb b
  2. Zwrócone zostaną 4 wartości w tym jedna powinna się dublować więc powinno się ją odfiltrować
  3. Kiedy już będę miał 3 wartości potrzebuje je usunąć ze zbiorów odpowiednio a lub b

Ogólnie to kod poniżej nie działa, nie wiem czemu wspolrzedne,size() jest czasami równe 4 dodatkowo zawiera zduplikowane elementy.
Przykład wzięty z dokumentacji -> http://www.cplusplus.com/reference/algorithm/unique/

#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;

bool isFalse (bool i) { return (i==false); }

int main()
{
    int testy = 0;
    int liczba_punktow = 0;
    long int a,b;
    vector<vector<long long> > wyniki;
    vector<long int> punkt;
    vector<long int> punkty;
    vector<bool> marker;
    vector <long int> x;
    vector <long int> y;
    vector <long int> wspolrzedne;
    vector<long int>::iterator x_max;
    vector<long int>::iterator x_min;
    vector<long int>::iterator y_max;
    vector<long int>::iterator y_min;

    //pobieranie danych wejsciowych
    cin >> testy;
    for (int i=0; i<testy; i++) {
        cin >> liczba_punktow;
        punkty.clear();
        x.clear();
        y.clear();
        marker.clear();
        for (int j=0; j<liczba_punktow; j++) {
            cin >>a>>b;
            x.push_back(a);
            y.push_back(b);
            punkty.push_back(j+1);
            marker.push_back(true);
        }


        //znajdywanie max i min
        wspolrzedne.clear();
        do {
            x_max = max_element(x.begin(), x.end());
            y_max = max_element(y.begin(), y.end());
            x_min = min_element(x.begin(), x.end());
            y_min = min_element(y.begin(), y.end());
            wspolrzedne.push_back(distance(x.begin(), x_max));
            wspolrzedne.push_back(distance(y.begin(), y_max));
            wspolrzedne.push_back(distance(x.begin(), x_min));
            wspolrzedne.push_back(distance(y.begin(), y_min));
            vector<long int>::iterator it;
            it = std::unique (wspolrzedne.begin(), wspolrzedne.end());
            wspolrzedne.resize( std::distance(wspolrzedne.begin(),it) );
            sort(wspolrzedne.begin(), wspolrzedne.end());


            for (int n=wspolrzedne.size()-1; n >= 0; n--) {
                if (n == 0 || n == 2) {
                    x.erase(x.begin()+wspolrzedne[n]);
                }
                else {
                    y.erase(y.begin()+wspolrzedne[n]);
                }
                marker[wspolrzedne[n]] = false;
            }

            wspolrzedne.clear();
        } while (count_if (marker.begin(), marker.end(), isFalse)<liczba_punktow);

    }

    return 0;
}
0

Jak masz coś usuwać, to może użyć set lub unordered_set zamiast vector? O ile kolejność jest nieważna i nie potrzeba duplikacji. A jak potrzeba duplikacji to multiset/unordered_multiset...

1 użytkowników online, w tym zalogowanych: 0, gości: 1