Как использовать функцию секционирования в C ++ для контейнера, содержащего пользовательские объекты - PullRequest
1 голос
/ 16 апреля 2019

Я пытаюсь использовать API parititon () для разбиения объекта, хранящегося в векторе.Я хочу вызвать функциональный объект для разделения вектора на две половины.Следующий код дает мне ошибку компиляции.Как это сделать в C ++?

partition.cpp: 15: 48: ошибка: ожидаемое первичное выражение до ')', токен auto itr = partition (v.begin (), v.end () - 1, комп);

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class comp{
public:
  bool operator()(const pair<int,int>& p1, const pair<int,int>& p2) {
    return p1.first < p2.first;
  }
};


main(){
  vector<pair<int,int> > v = { {1,2} , {3,4} , {5,6} ,{7,8} };
  auto itr = partition(v.begin(),v.end()-1,comp);

}

Ответы [ 3 ]

4 голосов
/ 16 апреля 2019

А как же

struct comp {
    int _median;
    comp(int median): _median(median) {
    }
    bool operator()(const pair<int,int>& p) {
        return p.first < _median;
    }
};

, а затем

auto i = std::partition(v.begin(), v.end(), comp{7});

Может потребоваться добавить копию ctr по умолчанию, переместить ctr, op =, dtr и другие леса

2 голосов
/ 16 апреля 2019

std::nth_element может заинтересовать вас для изменения диапазона:

std::vector<std::pair<int, int> > v = { {1,2} , {3,4} , {5,6} ,{7,8} };

auto mid = v.begin() + std::distance(v.begin(), v.end()) / 2;
std::nth_element(v.begin(), , v.end());

Теперь

каждый элемент диапазона [v.begin(), mid) меньше или равен середине.
каждый элемент диапазона (mid, v.end()) больше или равен середине.

0 голосов
/ 16 апреля 2019

Как показано в документации , предикат является унарным, и поэтому ему требуется один аргумент.

Что касается того, как передать аргумент:

  • comp является классом и не может быть передан в качестве аргумента
  • comp{} является созданным по умолчанию экземпляром comp, который предоставляет оператор вызова
...