Извлечение элементов из указанных индексов в c++

У меня есть два вопроса: любая помощь будет высоко оценена.

У меня есть матрица A ={ 0 1 0 0 1 1 0 0}. Теперь я нашел местоположения 0 индексов и сохранен в векторе B={0 2 3 6 7}.

  1. Как я могу извлечь элементы, индексированные вектором B в A, новому вектору, не повреждая оригинальный вектор A? т.е. я хочу получить C= {0 0 0 0 0} который является данными из A, индексированным B.

  2. Как стирать элементы в A, индексированные буквой B?

Я попробовал что-то вроде этого для вопроса нет. 2, но не преуспели.

///// erasing the elements in particular locations
sort (B.begin(), B.end());
for(int i=A.size() - 1; i >= 0; i--){ A.erase(A.begin() + B[i]);
}
3 ответа

Q1: Если вы счастливы сделать новый вектор, ответ PaulMcKenxie - это то, что вы хотите:

std::vector<int> C;
for (size_t i = 0; i < B.size(); ++i ) C.push_back(A[B[i]]);
</int>

Q2: В противном случае вам нужно удалить каждый экземпляр, не проиндексированный B Это относительно сложно, поскольку, удалив запись так, как вы это делали, вы принудительно осуществляете операцию, которая может/(будет?) Аннулировать ваши итераторы/указатели на данные.

Вероятно, лучшим решением (простым и эффективным) для этого является создание временного вектора C выше, а затем замена сокращенных данных в.

void delete_indexes(std::vector<int> &data, std::vector<int> &indexes)
{ std::vector<int> temp; for (size_t i = 0; i < indexes.size(); ++i ) { temp.push_back(data[indexes[i]]); } data.swap(temp); //does the work
}
int main()
{ //do stuff delete_indexes(A,B);
}
</int></int></int>

Опция swap выполняется быстро (просто свопы вместо удаления и записи), и временный вектор (с вашими исходными данными) удаляется, когда он выходит за рамки.

Редактировать: Этот ответ также может быть тем, что вы ищете, если у вас есть функция для генерации каждого элемента B который вы можете применить (даже если это A[i] == 1 (отредактированный код подходит):

for(auto it = A.begin(); it != A.end();)
{ if (criteria_for_B(*it)) it = A.erase(it); else ++it;
}


1.Как я могу выставлять элементы, индексированные вектором B в A, без повреждения исходного вектора A? т.е. я хочу получить C = {0 0 0 0 0}, который является данными из A, индексированным B.

std::vector<int> C;
for (size_t i = 0; i < B.size(); ++i ) C.push_back(A[B[i]]);
</int>

Конечно, мы предполагаем, что B не имеет записей, которые будут выходить за пределы вектора A


Для меня я использую функцию стирания, но со счетчиком для создания итератора:

#include <iostream>
#include <vector>
using namespace std;
int main(){ vector<int> A; A.push_back(0); A.push_back(1); A.push_back(0); A.push_back(0); A.push_back(1); A.push_back(1); A.push_back(0); A.push_back(0); vector<int> B; B.push_back(0); B.push_back(2); B.push_back(3); B.push_back(6); B.push_back(7); for(int i=0; i<a.size(); i++){="" cout="" <<="" a[i]="" "-";="" }="" endl;="" vector<int=""> C = A; int ii=0; for(int i=0; i</a.size();></int></int></vector></iostream>
<p> Вы можете использовать третий вектор как я или просто изменить A.</p> <p> Надеюсь, это поможет!</p>

licensed under cc by-sa 3.0 with attribution.