C ++ - удаление элемента по значению вектора пользовательского типа данных - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь удалить элемент вектора по значению для пользовательского типа данных vector.Это работает нормально, если я использую простой тип данных, например int и т. Д. Вместо hello типа данных.

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

class hello
{

public:
    hello() {
        x = false;
    }
    bool x;
};

int main() {

   hello f1;
   hello f2;
   hello f3;

   std::vector <hello> vector_t;

   vector_t.push_back(f1);
   vector_t.push_back(f2);
   vector_t.push_back(f3);

   for (unsigned int i = 0; i < vector_t.size(); i++)
       {
       if (vector_t[i].x)
       {
            vector_t.erase(std::remove(vector_t.begin(), vector_t.end(), i), vector_t.end());
        }
    }

    return 0;
}

Отображается ошибка:

двоичный '==': не найден оператор, который принимает левый операнд типа 'hello' (или не существует приемлемогопреобразование) vector_test

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Похоже, что вы хотите использовать remove_if, где .x является истинным.

vector_t.erase(std::remove_if(vector_t.begin(), vector_t.end(), [](const hello &h) { return h.x; }), vector_t.end());

Цикл for и условие if не являютсянеобходимо, они не нужны таким образом.

0 голосов
/ 13 июня 2018

Отображается ошибка:

binary '==': no operator found which takes a left-hand operand of type 'hello' (or there is no acceptable conversion) vector_test

Вы можете предоставить явно отсутствующий оператор == для вашего класса, который решит проблему:

bool operator==(hello const &h)
{
    return this->x == h.x;
} 

Ваше удаление / стирание должно выглядеть так:

vector_t.erase(std::remove(vector_t.begin(), vector_t.end(), vector_t[i]), vector_t.end());

Демонстрация: https://ideone.com/E3aV76

0 голосов
/ 13 июня 2018

remove пытается найти все элементы, которые сравнивают равными с тем, что вы ему передали.Если вы не скажете компилятору, как сравнивать hello объекты со значением целого i, он не сможет этого сделать.

Что вы, вероятно, хотели сделать, это просто удалить i-й элементвектор, если он удовлетворяет вашему критерию:

for (unsigned int i = 0; i < vector_t.size(); i++)
{
    if (vector_t[i].x)
    {
        vector_t.erase(vector_t.begin() + i);
        --i; // The next element is now at position i, don't forget it!
    }
}

Самый идиоматичный способ - использовать std::remove_if, как показано в ответе acgraig5075.

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