Как проверить, что вектор c ++ уже содержит элемент с определенным значением (в данном случае это структура)? - PullRequest
0 голосов
/ 26 мая 2019

Мне нужно проверить, существует ли элемент с определенным значением в векторе c ++, прежде чем добавлять новый (чтобы избежать дублирования).

Я проверил все, и это решение (упрощенный код ниже) кажется наиболее эффективным, если бы оно работало.

У меня проблема именно с этой строкой:

"if (std :: find (позиции.begin (), позиции.end (), pos)! = Позиции.end ())",

, который дает мне ошибки компиляции внутри библиотеки, говоря: «Недопустимые операнды для двоичного выражения ('position' и 'const position')".

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

Это факт, что значение является структурой? Это как-то связано со значениями по сравнению с указателями / ссылками (я подозреваю, что это так)?

struct position
{
    int column;
    int row;
};


int main ()
{
    std::vector<position> positions = {{0,0}, {0,1}, {0,2}, {1,0}, {1,1}, {1,2}};

    position pos = {2,1};

    if(std::find(positions.begin(), positions.end(), pos) != positions.end())
    {

        positions.push_back(pos);
    }
    else
    {
        std::cout << "Value is already present" << std::endl;
    }

    return 0;
}

Я ничего не понимаю и действительно застрял с этим, что мешает мне продвигаться в моем проекте.

Кто-нибудь имеет представление о том, что я делаю неправильно или как мне это сделать?

Большое спасибо!

1 Ответ

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

Здесь две вещи неправильны (могут быть и другие, но они уместны).

Во-первых, в вашей структуре нет оператора равенства, который позволил бы find сравнивать элементы. Это может быть добавлено что-то вроде:

struct position {
    int column;
    int row;
    bool operator==(const position &other) const {
        return column == other.column && row == other.row;
    }
};

Во-вторых, смысл вашего сравнения неверен. find вернет end, если элемент не найден, поэтому ваш if раздел должен быть:

if (std::find(positions.begin(), positions.end(), pos) == positions.end()) {
    positions.push_back(pos);
} else {
    std::cout << "Value is already present" << std::endl;
}

Для полноты, вот полная программа, которая показывает, что происходит, когда вы пытаетесь добавить несуществующий элемент три раза:

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

struct position {
    int column;
    int row;
    bool operator==(const position &other) const {
        return column == other.column && row == other.row;
    }
};

int main () {
    std::vector<position> vec = {};

    position pos = {2,1};
    for (int i = 0; i < 3; ++i) {
        if (std::find(vec.begin(), vec.end(), pos) == vec.end()) {
            std::cout << "Adding value" << std::endl;
            vec.push_back(pos);
        } else {
            std::cout << "Value is already present" << std::endl;
        }
    }

    return 0;
}

На выходе вы можете видеть только первый, который вставляет:

Adding value
Value is already present
Value is already present
...