создать std :: vector из приложения функции - PullRequest
0 голосов
/ 12 мая 2018

Учитывая вектор v1 объектов и функцию, работающую с ними, возвращающую значение,

std::vector<OBJ> v1; // already filled
bool foo(const OBJ&);

Каков был бы самый чистый способ создания vector<bool> v2, исходя из применения foo к каждому элементу v1? Я бы предпочел не писать цикл, но я не могу найти подходящую команду в STL.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Я полностью согласен с решением, используя std::transform. Тем не менее, мы могли бы сделать это намного проще std::for_each() из <algorithm>.

Мы рассматриваем каждый элемент вектора vec (который является вашим OBJ), insert bool возврат из foo() в конце / конце следующего вектора v.

Что-то вроде следующего. Вот прямая трансляция: https://www.ideone.com/pyfqmF

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

using OBJ = int;

bool foo(const OBJ& a)
{ return a == 1; }

int main()
{
   std::vector< OBJ > vec = {1, 2, 3, 4};
   std::vector< bool > v;
   v.reserve(vec.size());

   std::for_each(vec.begin(), vec.end(), [&v](const OBJ& a)->void
      {
         v.insert(v.end(), foo(a) );
      });

   for(auto const& it: v) std::cout << it << std::endl;

   return 0;
}
0 голосов
/ 12 мая 2018

Похоже на работу для std::transform.

Конечно, есть цикл, но это деталь реализации transform.

пример:

#include <vector>
#include <algorithm>

template<typename Obj, typename IsTrue>
std::vector<bool> truth(std::vector<Obj> const& v, IsTrue&& truth_func)
{
    auto result = std::vector<bool>(v.size());
    std::transform(std::begin(v), std::end(v), 
                   std::begin(result), 
                   std::forward<IsTrue>(truth_func));
    return result;
}


int main()
{
    std::vector<int> v { 1, 2, 3, 4, 5 };

    auto is_even = [](auto&& x)
    {
        return (x % 2) == 0;
    };

    auto vb = truth(v, is_even);
}
...