c ++ найти переменную в векторе структур - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь создать программу на c ++, где я могу динамически добавлять точки в список, а затем искать, есть ли эти точки в списке.

Я изначально пытался использовать наборы, но я сейчас пытаюсь использовать векторы. Мой код ниже будет работать, но получит ошибку, связанную с оператором поиска if.

#include <stdio.h>       /* printf */
#include <bits/stdc++.h> /* vector of strings */
#include <algorithm>
#include <vector>
using namespace std;

void solve_point(vector<vector<char>> &board)
{
    printf("solve_point\n");
    board[2][2] = 'c';
}

struct point
{
    int x;
    int y;
};

int main()
{

    vector<point> vec; 
    point point1{4, 1};
    point point1{8, 3};
    vec.push_back(point1);

    if (find(vec.begin(), vec.end(), point1) != vec.end())
    {   
        printf("point1 found in vec\n");
    }
    else
    {
        printf("point1 not found in vec\n");
    }

   }

Это приводит к некоторым ошибкам, говорящим:

/usr/include/c++/7/bits/predefined_ops.h:241:17: error: no match for ‘operator==’ (operand types are ‘point’ and ‘const point’)
  { return *__it == _M_value; }

  ..and..

  /usr/include/c++/7/bits/predefined_ops.h:241:17: note:   ‘point’ is not derived from ‘const __gnu_cxx::new_allocator<_Tp>’
  { return *__it == _M_value; }

Я столкнулся с ошибкой, подобной этой ранее, когда пытался вставить точку в набор, есть ли что-то не так с моя инициализация структуры точки? Спасибо

1 Ответ

1 голос
/ 19 марта 2020

У вас возникли две проблемы:

  1. std::find() нужен способ сравнения двух struct point экземпляров. Для этого по умолчанию используется point::operator==(), который не определен. Вы должны добавить это вручную:
struct point
{
    int x;
    int y;

    bool operator==(const point& rhs) const {
        return x == rhs.x and y == rhs.y;   
    }
};

В качестве альтернативы вы можете использовать std::find_if(), который позволяет вам поставлять лямбду. Однако экземпляры такого класса, как point, скорее всего, нужно будет сравнивать во многих местах, поэтому определение operator==() определенно хорошая идея.

Вы переделываете point1. Переименуйте его, например, в point2.

Рабочий пример:

#include <bits/stdc++.h> /* vector of strings */
#include <algorithm>
#include <vector>
using namespace std;

void solve_point(vector<vector<char>> &board)
{
    printf("solve_point\n");
    board[2][2] = 'c';
}

struct point
{
    int x;
    int y;

    bool operator==(const point& rhs) const {
        return x == rhs.x and y == rhs.y;   
    }
};

int main()
{

    vector<point> vec; 
    point point1{4, 1};
    point point2{8, 3};
    vec.push_back(point1);

    if (find(vec.begin(), vec.end(), point1) != vec.end())
    {   
        printf("point1 found in vec\n");
    }
    else
    {
        printf("point1 not found in vec\n");
    }

   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...