Использование std :: transform для создания вектора пары - PullRequest
6 голосов
/ 03 мая 2019

Я хотел бы создать vector пар, начиная с пары vector с.Например, если A равно std::vector A = [1 0 1] и B равно std::vector B = [0 1 0], я хочу структуру std::vector C = [1 0, 0 1, 1 0], где C_i = std::pair(A_i,B_i).

. Я бы избегал цикла for, проходящего через два вектора,поэтому я ищу несколько строк кода, таких как std::transform().

Я попробовал следующий код:

std::vector<bool> boolPredLabel(tsLabels.size()); 
std::vector<bool> boolRealLabel(tsLabels.size());
std::vector<std::pair<bool,bool>> TrPrPair(tsLabels.size());
std::transform(boolRealLabel.begin(), boolRealLabel.end(), boolPredLabel.begin(), TrPrPair.begin(),std::make_pair());

Это привело меня к ошибке компилятора:

error: no matching function for call to ‘make_pair()’
std::transform(boolRealLabel.begin(), boolRealLabel.end(), boolPredLabel.begin(), TrPrPair.begin(),std::make_pair());
...
note:   candidate expects 2 arguments, 0 provided
std::transform(boolRealLabel.begin(), boolRealLabel.end(), boolPredLabel.begin(), TrPrPair.begin(),std::make_pair());

Сообщение понятно, но я не знаю, что передать бинарному оператору.Я должен признать, что у меня нет четкого понимания std::transform(), и я просто использую его с функтором.

1 Ответ

7 голосов
/ 03 мая 2019

Двоичная операция, которую вы передаете, не имеет никакого смысла.std::make_pair является шаблоном функции, принимающим два аргумента, поэтому вы не можете вызывать его без этих двух аргументов и не может быть создан как объект функции для передачи в std::transform.

Вместо этого вы можете явносоздать экземпляр std::make_pair для рассматриваемых типов шаблонов и передать его алгоритму (@RetiredNinja указал на это, но, видимо, чувствовал себя слишком ленивым, чтобы написать ответ):

std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(),
    boolPredLabel.cbegin(), TrPrPair.begin(), std::make_pair<bool, bool>);

Два других часто встречающихся варианта - этолямбда,

std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(), boolPredLabel.cbegin(),
    TrPrPair.begin(), [](bool a, bool b){ return std::make_pair(a, b); });

или указатель на функцию

std::pair<bool, bool> toPair(bool a, bool b)
{
    return std::make_pair(a, b);
}

std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(),
    boolPredLabel.cbegin(), TrPrPair.begin(), toPair);

А для полноты cppreference на std::transform и ее аргумент двоичной операции (относится только кперегрузка, действующая на два входных диапазона):

binary_op - объект функции двоичной операции, который будет применен.

Подпись функции должна быть эквивалентна следующей:

Ret fun(const Type1 &a, const Type2 &b); 
...