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