Как вставить в массив заданную позицию, используя std::move_backwards

#c #c 11 #std #move

#c #c 11 #ЗППП #переместить

Вопрос:

Я пытаюсь реализовать функцию вставки, используя std::move_backward. Я нашел этот код на cplusplus.com . Я не совсем понимаю, как работает std::move_backward .

 #include <algorithm>    // std::move_backward
#include <string>       // std::string

int main () {
  std::string elems[10] = {"air","water","fire","earth"};

  // insert new element at the beginning:
  std::move_backward (elems,elems 4,elems 5);
  elems[0]="ether";

  std::cout << "elems contains:";
  for (int i=0; i<10;   i)
    std::cout << " [" << elems[i] << "]";
  std::cout << 'n';

  return 0;
}
 

output is "elems contains: [ether] [air] [water] [fire] [earth] [] [] [] [] []"

как бы вы вставили во 2-ю позицию (или любую позицию), используя тот же метод, что и выше, чтобы
результат был
output: elems contains: [air] [ether] [water] [fire] [earth] [] [] [] [] []

Комментарии:

1. Есть ли у вас основания для использования move_backwards в частности? Или это только то, что вы пытались решить проблему?

2. @cigien это как раз то, с чем я пытался решить проблему. Я также не хочу делать ненужную копию. Если вы знаете какой-то лучший / другой способ решения этой проблемы, пожалуйста, дайте мне знать.

3. Нет, это хороший алгоритм для этого. Мне просто интересно, выбрали ли вы это только потому, что где-то нашли.

Ответ №1:

Если вы хотите вставить ether во вторую позицию, просто измените диапазон, который вы перемещаете назад, чтобы не включать 0-ю позицию:

 std::move_backward(elems 1, elems 4, elems 5);
                    //  ^^ ignore 0th position
elems[1]="ether"; // insert element at at 1st position
 

Вот демонстрация