алгоритм — удаление полей в векторе c ++

Я не могу понять идею и запрограммировать такую ​​вещь правильно (я новичок):
У меня есть вектор. Вектор имеет, скажем, элементы: fieldA, fieldB, fieldC. Итак, имея массив этих векторов, я хочу проверить, начиная с последнего вектора в массиве и переходя к направлению первого, если один из элементов имеет определенное значение, скажем, если (vect [i]. fieldA == 0.0). В таком случае, если (vect [i-1] .fieldA == 0.0) имеет одинаковое значение, я хочу удалить весь вектор из массива. Может ли кто-нибудь предоставить мне часть кода, которая будет визуализировать, как создать правильный цикл «обратной итерации» и использовать функцию для его удаления? Я пытался с erase (), remove (), deque (), но мне не удалось.

Я не хочу связываться здесь с моими кодами.

Спасибо за помощь!

РЕДАКТИРОВАТЬ. Поэтому сначала я зациклил свой массив значениями векторов, а затем хочу удалить все векторы с конца, которые содержат специфические для элемента значения, например, fieldA == 0.0

Я хочу вырезать массив, а не только удалить содержимое векторов!
Существует правильное наследование между classB и classA, поэтому кормление работает хорошо, я хочу только решить эту проблему с удалением векторов.
пример: массив векторов из 2 элементов. вход: 0,1 0,3 3,3 2,3 0,6 5,6 0,8 0,7 0,6 выход: 0,1 0,3 3,3 2,3 0,6 5,6 0 , 8. Вывод: 0,7 и 0,6 вектора были удалены.

    classA tmp;
for (std::vector<std::classB>::iterator iter = newW.begin(); iter != newW.end(); iter++)
{
tmp.set_fieldA(iter->a);
tmp.set_fieldB(iter->b);
tmp.set_fieldC(iter->c);
objA.push_back(tmp);
}

vector<std::classA> objA;
for(int i = objA.size()-1; i > 0; i--)
{
if (objA[i].fieldA == 0.0)
if (objA[i-1].fieldA == 0.0)
objA.erase(objA[i-1]); //remove last vector from array
}

2

Решение

Я интерпретирую ваш код следующим образом. У тебя есть структура по имени Вектор с 3 членами

struct Vector
{
double fieldA;
double fieldB;
double fieldC;
}

Код ниже работает следующим образом. Оно использует std::find_if_not с обратные итераторы (rbegin() а также rend()) найти первый элемент со спины, который имеет fieldA отличный от 0, Затем он преобразует это в обычный итератор (используя base()) и сравнивает его с концом вектора. Наконец звонок v.erase будет фактически стереть их (так называемый стереть-удалить идиому)

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

int main()
{

struct Vector { int fieldA; int fieldB; };
std::vector<Vector> v = {
Vector{ 1, 0 }, Vector{ 2, 1 }, Vector{ 0, 2 }, Vector{ 1, 3 }, Vector{ 0, 4 },
Vector{ 0, 5 }, Vector{ 5, 6 }, Vector{ 6, 7 }, Vector{ 0, 8 }, Vector{ 0, 9 }, Vector{ 0, 10}
};

for (auto& e: v) { std::cout << "{" << e.fieldA << "," << e.fieldB << "}, "; };
std::cout << "\n";

auto m = std::find_if_not(v.rbegin(), v.rend(), [&](Vector const& elem){
return elem.fieldA == 0;
}).base();

if (m != v.end())
// remove all but one matching element
v.erase(m + 1, v.end());

for (auto& e: v) { std::cout << "{" << e.fieldA << "," << e.fieldB << "}, "; };
std::cout << "\n";
}

Выход на LiveWorkSpace

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector