Я добавлю важную особенность, которую игнорировали все остальные ответы: отмена.
. Одна из больших вещей в 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)
{
...
}
Вы можете использовать обратные итераторы для итерации через родителей, например:
#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()
.
iterator
сstd::begin()
сbackward_iterator
. Таким образомinsert()
не сработал. Кстати, я также нашелstd::reverse_copy(cut2, std::end(parent2), std::back_inserter(child1))
для работы. У вас есть идея, какое решение более эффективно? – KorbenDose 13 July 2018 в 10:41