Вставить в вектор в обратном порядке

Я добавлю важную особенность, которую игнорировали все остальные ответы: отмена.

. Одна из больших вещей в TPL - поддержка отмены, а в консольных приложениях есть метод отмены, встроенный ( CTRL + C). Их очень просто связать. Вот как я структурирую все мои асинхронные консольные приложения:

static void Main(string[] args)
{
    CancellationTokenSource cts = new CancellationTokenSource();

    System.Console.CancelKeyPress += (s, e) =>
    {
        e.Cancel = true;
        cts.Cancel();
    };

    MainAsync(args, cts.Token).Wait();
}

static async Task MainAsync(string[] args, CancellationToken token)
{
    ...
}
0
задан KorbenDose 13 July 2018 в 08:59
поделиться

1 ответ

Вы можете использовать обратные итераторы для итерации через родителей, например:

#include <iostream>
#include <vector>

int main() {
  std::vector<int> parent1{1, 2, 3, 4, 5};
  std::vector<int> parent2{6, 7, 8, 9, 0};

  std::vector<int> child1;
  std::vector<int> child2;

  int cut = 2;
  {
    auto cut1 = std::begin(parent1); // set cut1 to element 1
    auto cut2 = parent2.rbegin(); // set cut2 to element 0 (reverse)
    std::advance(cut1, cut); // iterate cut1 to element 3
    std::advance(cut2, cut); // iterate cut2 to element 8 (reverse)

    child1.insert(child1.end(), cut1, std::end(parent1)); // copy elements 3, 4 ,5
    child1.insert(child1.end(), parent2.rbegin(), cut2); // copy elements 0, 9 (reverse)
  }
  {
    auto cut1 = parent1.rbegin(); // set cut1 to element 5 (reverse)
    auto cut2 = parent2.begin(); // set cut2 to element 6
    std::advance(cut1, parent1.size() - cut); // iterate cut1 to element 2 (reverse)
    std::advance(cut2, parent2.size() - cut); // iterate cut2 to element 9

    child2.insert(child2.end(), cut1, parent1.rend()); // copy elements 2, 1 (reverse)
    child2.insert(child2.end(), parent2.begin(), cut2); // copy elements 6, 7, 8
  }
  for (const auto& el : child1) {
    std::cout << el << " ";
  }
  std::cout << std::endl;
  for (const auto& el : child2) {
    std::cout << el << " ";
  }
  std::cout << std::endl;
  return 0;
}

С C ++ 14 вы можете использовать std::rbegin(parent2) вместо parent2.rbegin().

2
ответ дан Thomas Sablik 17 August 2018 в 13:18
поделиться
  • 1
    О, хорошо, вижу. Моя ошибка заключалась в смешивании iterator с std::begin() с backward_iterator. Таким образом insert() не сработал. Кстати, я также нашел std::reverse_copy(cut2, std::end(parent2), std::back_inserter(child1)) для работы. У вас есть идея, какое решение более эффективно? – KorbenDose 13 July 2018 в 10:41
  • 2
    Я оценил оба решения, и ваш немного быстрее. – Thomas Sablik 13 July 2018 в 11:03
Другие вопросы по тегам:

Похожие вопросы: