Поиск значений в векторах в C ++ - PullRequest
2 голосов
/ 13 октября 2019

Можно воссоздать следующую функцию, используя только библиотеку <algorithm>, без выполнения цикла для?

bool find(int x, int y, vector<vector<int>> v)
{    
    for(int j=v[0].size()-1;j>=0;j--)
        if((x==v[0][j])and(y==v[1][j])) return true;
    return false;
}

, где v={{x values},{y values}} и v[0].size()=v[1].size()

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Вы можете использовать std::mismatch:

bool find(int x, int y, const vector<int>& v1, const vector<int>& v2)
{
   const auto mismatches = [x, y] (int lhs, int rhs) { return lhs != x || rhs != y; };
   return std::mismatch(v1.cbegin(), v1.cend(), v2.cbegin(), mismatches).first != v1.cend();
}
1 голос
/ 13 октября 2019

В основном, один из способов сделать это, используя find_if:

bool find(int x, int y, std::vector<std::vector<int>> v) {
return v[0].end() != std::find_if(v[0].begin(), v[0].end(),
                                  [x, y, second_vec = v[1].data(), first_data_addr = v[0].data()](int &val) {
                                      return (x == val) && (y == *(second_vec + (&val - first_data_addr)));
                                  });
}

Аналогично, но без путаницы с адресами:

bool find(int x, int y, std::vector<std::vector<int>> v) {
    return v[0].end() != std::find_if(v[0].begin(), v[0].end(),
                                      [x, y, second_vec = v[1].data()](int &val) mutable {
                                          static int j;
                                          auto ans = (x == val) && (y == *(second_vec + j));
                                          j++;
                                          return ans;
                                      });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...