Stream merge: Difference between revisions

Content added Content deleted
Line 580: Line 580:
}
}
</lang>
</lang>

=={{header|C++}}==
{{trans|C#}}
<lang cpp>//#include <functional>
#include <iostream>
#include <vector>

template <typename C, typename A>
void merge2(const C& c1, const C& c2, const A& action) {
auto i1 = std::cbegin(c1);
auto i2 = std::cbegin(c2);

while (i1 != std::cend(c1) && i2 != std::cend(c2)) {
if (*i1 <= *i2) {
action(*i1);
i1 = std::next(i1);
} else {
action(*i2);
i2 = std::next(i2);
}
}
while (i1 != std::cend(c1)) {
action(*i1);
i1 = std::next(i1);
}
while (i2 != std::cend(c2)) {
action(*i2);
i2 = std::next(i2);
}
}

template <typename A, typename C>
void mergeN(const A& action, std::initializer_list<C> all) {
using I = typename C::const_iterator;
using R = std::pair<I, I>;

std::vector<R> vit;
for (auto& c : all) {
auto p = std::make_pair(std::cbegin(c), std::cend(c));
vit.push_back(p);
}

bool done;
R* least;
do {
done = true;

auto it = vit.begin();
auto end = vit.end();
least = nullptr;

// search for the first non-empty range to use for comparison
while (it != end && it->first == it->second) {
it++;
}
if (it != end) {
least = &(*it);
}
while (it != end) {
// search for the next non-empty range to use for comaprison
while (it != end && it->first == it->second) {
it++;
}
if (least != nullptr && it != end
&& it->first != it->second
&& *(it->first) < *(least->first)) {
// found a smaller value
least = &(*it);
}
if (it != end) {
it++;
}
}
if (least != nullptr && least->first != least->second) {
done = false;
action(*(least->first));
least->first = std::next(least->first);
}
} while (!done);
}

void display(int num) {
std::cout << num << ' ';
}

int main() {
std::vector<int> v1{ 0, 3, 6 };
std::vector<int> v2{ 1, 4, 7 };
std::vector<int> v3{ 2, 5, 8 };

merge2(v2, v1, display);
std::cout << '\n';

mergeN(display, { v1 });
std::cout << '\n';

mergeN(display, { v3, v2, v1 });
std::cout << '\n';
}</lang>
{{out}}
<pre>0 1 3 4 6 7
0 3 6
0 1 2 3 4 5 6 7 8</pre>


=={{header|C#|C sharp}}==
=={{header|C#|C sharp}}==