C ++ - выталкивание первого элемента вектора - PullRequest
0 голосов
/ 17 мая 2019

Я прошу прощения, если это дубликат.Я обещаю, что сначала попытался найти ответ.

Я хочу создать двоичную кучу, используя вектор.Для этого мне нужно реализовать функцию pop, которая удаляет «top».В этом случае он просто удалил первый элемент.

Я попытался использовать функцию перемещения, как таковую:

items[Root()] = std::move(items[cur_size--]);

Это должно заменить корень другим элементом, который затем будет переупорядочен(что также не работает).

Вместо этого я попробовал что-то такое:

std::vector<int> items;
int root = 0;
size_t Root() {
  return root;
}

void Pop() {
  items.erase(items.begin()+root);
  root++;
  // here I would call the reorder function
}

Таким образом, я бы эффективно изменил корень и работал бы так, как будто вектор начинался наn-я позиция, а не в 0.

Мой вопрос: имеет ли это смысл или есть лучший способ, которым я мог бы это реализовать?

edit: добавленный вектор

1 Ответ

0 голосов
/ 17 мая 2019

Чтобы вытолкнуть первый элемент std::vector (назовем его myvector), вам просто нужно написать:

myvector.erase(myvector.begin()); // pop front

Теперь, если у вас есть двоичное дерево, сохраненное в std::vector, удаление корня оставит вас с двумя дочерними элементами (двумя корнями).

Если вы хотите сохранить только одно из двух поддеревьев, вам нужно выбрать нужное (новый корень).
Затем, в зависимости от того, хранит ли ваше std::vector двоичное дерево в в ширину или в сначала в глубину , вам нужно найти все элементы относительно поддерева, которое вы хотите сохранить ( Поиск в ширину или Поиск в глубину ) и построение еще одного std::vector с нужным поддеревом.
В конце вы воздействуете на вычисленное поддерево, чтобы исходный вектор.


Надеюсь, это вам поможет.

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