<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://51.250.0.107/w/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BA%D1%83%D1%81%D1%82%D0%B8%D0%BA%D0%B0%2F%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%2FIteratorAdapterConditional</id>
	<title>Архитектурная акустика/Реализация/IteratorAdapterConditional - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://51.250.0.107/w/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BA%D1%83%D1%81%D1%82%D0%B8%D0%BA%D0%B0%2F%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%2FIteratorAdapterConditional"/>
	<link rel="alternate" type="text/html" href="http://51.250.0.107/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BA%D1%83%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F/IteratorAdapterConditional&amp;action=history"/>
	<updated>2026-04-30T07:28:24Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://51.250.0.107/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BA%D1%83%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F/IteratorAdapterConditional&amp;diff=6700&amp;oldid=prev</id>
		<title>Андрей Чусов: Новая страница: «{{class|Архитектурная акустика/Реализация/IteratorAdapterConditional}}  {{example_begin}} &lt;source lang=&quot;cpp&quot;&gt; #include &quot;collection_…»</title>
		<link rel="alternate" type="text/html" href="http://51.250.0.107/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BA%D1%83%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F/IteratorAdapterConditional&amp;diff=6700&amp;oldid=prev"/>
		<updated>2018-01-08T14:37:22Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «{{class|Архитектурная акустика/Реализация/IteratorAdapterConditional}}  {{example_begin}} &amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt; #include &amp;quot;collection_…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{class|Архитектурная акустика/Реализация/IteratorAdapterConditional}}&lt;br /&gt;
&lt;br /&gt;
{{example_begin}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;collection_base.h&amp;quot;&lt;br /&gt;
#include &amp;lt;array&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace Chusov::Math;&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class Container&amp;gt;&lt;br /&gt;
std::array&amp;lt;int, 20 * 10&amp;gt; extract_even_range_for(const Container&amp;amp; cont)&lt;br /&gt;
{&lt;br /&gt;
    std::vector&amp;lt;std::thread&amp;gt; vecThreads;&lt;br /&gt;
    std::array&amp;lt;int, 20 * 10&amp;gt; EvenValues;&lt;br /&gt;
    for (unsigned i = 0; i &amp;lt; std::thread::hardware_concurrency(); ++i)&lt;br /&gt;
        vecThreads.emplace_back([&amp;amp;vecThreads, i, &amp;amp;cont, &amp;amp;EvenValues]()&lt;br /&gt;
    {&lt;br /&gt;
        for (auto&amp;amp;&amp;amp; v :&lt;br /&gt;
            adapt_iterator_range&amp;lt;IteratorAdapterConditional&amp;gt;(&lt;br /&gt;
                adapt_iterator_range&amp;lt;IteratorAdapterForStep&amp;gt;(&lt;br /&gt;
                    Chusov::Memory::make_iterator_range(make_iterator_adapter&amp;lt;IteratorAdapter2D&amp;gt;(cont.crbegin()) + i, cont.crend()),&lt;br /&gt;
                    std::thread::hardware_concurrency(),&lt;br /&gt;
                    adapt_iterator_range&amp;lt;IteratorAdapter2D&amp;gt;(cont.crbegin(), cont.crend())&lt;br /&gt;
                    ),&lt;br /&gt;
                [](int x) -&amp;gt; bool {return (x &amp;amp; 1) == 0; },&lt;br /&gt;
                //or: [](IteratorAdapterForStep&amp;lt;IteratorAdapter2D&amp;lt;Matrix&amp;lt;int&amp;gt;::const_reverse_iterator&amp;gt;&amp;gt; _it) -&amp;gt; bool {return (*_it &amp;amp; 1) == 0;},&lt;br /&gt;
                //or: [](IteratorAdapter2D&amp;lt;Matrix&amp;lt;int&amp;gt;::const_reverse_iterator&amp;gt; _it) -&amp;gt; bool {return (*_it &amp;amp; 1) == 0;},&lt;br /&gt;
                [&amp;amp;cont](auto _it) -&amp;gt; bool {return _it.adaptation_base() != cont.crend(); }&lt;br /&gt;
                //or: [&amp;amp;cont](IteratorAdapterForStep&amp;lt;IteratorAdapter2D&amp;lt;Matrix&amp;lt;int&amp;gt;::const_reverse_iterator&amp;gt;&amp;gt; it) -&amp;gt; bool {return it != cont.crend();}&lt;br /&gt;
                )&lt;br /&gt;
            )&lt;br /&gt;
            EvenValues[20 * 10 - v / 2] = v;&lt;br /&gt;
    });&lt;br /&gt;
    for (auto&amp;amp;&amp;amp; thr : vecThreads)&lt;br /&gt;
        thr.join();&lt;br /&gt;
    return EvenValues;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class Container&amp;gt;&lt;br /&gt;
std::array&amp;lt;int, 20 * 10&amp;gt; extract_even_direct_for(const Container&amp;amp; cont)&lt;br /&gt;
{&lt;br /&gt;
    std::vector&amp;lt;std::thread&amp;gt; vecThreads;&lt;br /&gt;
    std::array&amp;lt;int, 20 * 10&amp;gt; EvenValues;&lt;br /&gt;
    for (unsigned i = 0; i &amp;lt; std::thread::hardware_concurrency(); ++i)&lt;br /&gt;
        vecThreads.emplace_back([&amp;amp;vecThreads, i, &amp;amp;cont, &amp;amp;EvenValues]()&lt;br /&gt;
    {&lt;br /&gt;
        for (auto it = make_iterator_adapter&amp;lt;IteratorAdapterConditional&amp;gt;(&lt;br /&gt;
            make_iterator_adapter&amp;lt;IteratorAdapterForStep&amp;gt;(&lt;br /&gt;
                i,&lt;br /&gt;
                std::thread::hardware_concurrency(),&lt;br /&gt;
                adapt_iterator_range&amp;lt;IteratorAdapter2D&amp;gt;(cont.crbegin(), cont.crend())&lt;br /&gt;
                ),&lt;br /&gt;
            //generic lambda causes ambiguity: should it pass an iterator or a value here&lt;br /&gt;
            [](IteratorAdapterForStep&amp;lt;IteratorAdapter2D&amp;lt;Matrix&amp;lt;int&amp;gt;::const_reverse_iterator&amp;gt;&amp;gt; _it) -&amp;gt; bool {return (*_it &amp;amp; 1) == 0; }, &lt;br /&gt;
            [&amp;amp;cont](auto _it) -&amp;gt; bool {return _it.adaptation_base() != cont.crend(); }&lt;br /&gt;
        ); it.adaptation_base() != make_iterator_adapter&amp;lt;IteratorAdapter2D&amp;gt;(cont.crend()); ++it)&lt;br /&gt;
            EvenValues[20 * 10 - *it / 2] = *it;&lt;br /&gt;
    });&lt;br /&gt;
    for (auto&amp;amp;&amp;amp; thr : vecThreads)&lt;br /&gt;
        thr.join();&lt;br /&gt;
    return EvenValues;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv)&lt;br /&gt;
{&lt;br /&gt;
    auto m2 = Matrix&amp;lt;int&amp;gt;(0, 20, 20);&lt;br /&gt;
    auto x = 1;&lt;br /&gt;
    for (auto&amp;amp;&amp;amp; v : adapt_iterator_range&amp;lt;IteratorAdapter2D&amp;gt;(m2.begin(), m2.end()))&lt;br /&gt;
        v = x++;&lt;br /&gt;
    auto rng_based = extract_even_range_for(m2);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;\nElements of an array with even elements of a matrix put in parallel in reverse order (range-for based).\n&amp;quot;;&lt;br /&gt;
    for (auto val:rng_based)&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; val &amp;lt;&amp;lt; &amp;quot;\t&amp;quot;;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
    auto direct_based = extract_even_direct_for(m2);&lt;br /&gt;
    for (auto val : direct_based)&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; val &amp;lt;&amp;lt; &amp;quot;\t&amp;quot;;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{example_end}}&lt;/div&gt;</summary>
		<author><name>Андрей Чусов</name></author>
	</entry>
</feed>