пятница, 17 февраля 2017 г.

Быстрая сортировка, сортировка Хоара.

Быстрая сортировкаQuickSort.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <algorithm>

using namespace std;

void quickSort(int *arr, int left, int right)
{
    int i = left, j = right;
    int middle = arr[(left + right) / 2];

    do
    {
        while(arr[i] < middle) i++;
        while(arr[j] > middle) j--;
        if(i <= j)
        {
            swap(arr[i], arr[j]);
            i++;
            j--;
        }
    }
    while (i <= j);

    if(i < right)
        quickSort(arr, i, right);
    if(left < j)
        quickSort(arr, left, j);

}
int main()
{
    int arrSize = 20;
    int arr[arrSize];

    for(int i(0); i < arrSize; ++i)
        arr[i] = rand() % 200 - 100;

    quickSort(arr, 0, arrSize - 1);

    for(int i(0); i < arrSize; ++i)
        cout << i << ": "<< arr[i] << endl;
    return 0;
}

9 строка: выбираем опорный элемент (центральный элемент массива)

13 строка: пока значение указателя меньше опорного, переходим к следующему элементу массива, запоминаем положение, если нарушается условие переходим к следующему вайлу.

14 строка: пока значение указателя больше опорного, переходим к предыдущему элементу массива, запоминаем положение указателя, если не совпадает условие переходим к условию.

22 строка: левый счётчик не должен выходить за пределы правого счётчика.

24 строка: если левый указатель меньше правой стартовой позиции то запускаем функцию рекурсивно, передаём в неё массив, стартовую позицию, конечную позицию.

26 строка: если правый указатель больше левой стартовой позиции, то запускаем функцию рекурсивно.

вторник, 7 февраля 2017 г.

C++, побитовый свдиг влево (<<), побитовый сдвиг вправо (>>), по простому.

   Побитовый сдвиг по простому.

val << n - это сдвиг влево переменной val на n разрядов. то же самое что умножение на 2 в определенной степени.
пример: 


1
2
int val = 4;
int temp = val << 3;

в результате temp=32. по другому это val*(2^3);

val >> n - это сдвиг вправо переменной val на n разрядов. то же самое что деление на 2 в определенной степени.
пример: 


1
2
int val = 4;
int temp = val >> 2;

в результате temp=1. по другому это val/(2^2);


Интеллектуальные указатели (Smart Pointers) C++




Интеллектуальный указатель - это объект класса, который действует подобно указателю, но обладает дополнительными возможностями.



В предыдущем стандарте C++03 в наличии имелось только два вида указателей, стандартный и один умный std::auto_ptr.


Проблема std::auto_ptr, выявляется в коде ниже:


1
2
3
auto_ptr<string> p1(new string("Hello"));
auto_ptr<string> p2;
p2 = p1;

В строке 3 p2 получает права владения объектом string, указатель p1 лишается этих прав. Это вроде бы хорошо так как вызывается один раз деструктор для указателя, а не два раза чтобы удалить один и тот же объект. Но вдруг программа где то использует данные из p1. А p1 уже не указывает на данные.

Пример с контейнером:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <memory>

int main()
{
    using namespace std;
    auto_ptr<string> films[5] =
    {
        auto_ptr<string> (new string("Hello")),
        auto_ptr<string> (new string("Goodbuy")),
        auto_ptr<string> (new string("Good morning")),
        auto_ptr<string> (new string("Good evening")),
        auto_ptr<string> (new string("Good afternoon"))
    };
    auto_ptr<string> pFilm;
    pFilm = films[3];

    for(int i(0); i < 5; ++i)
    {
        cout << *films[i] << endl;
    }
}

Элемент массива становится не валидным, так как в 16 строке мы передали права на объект указателю pFilm. Программа скомпилируется но выдаст ошибку в процессе выполнения.

***

std::unique_ptr - немного отличается от std::auto_ptr, тем что запрещает копирование. Это безопаснее так как мы увидим ошибку на этапе компиляции, а не увидим сбой программы и будем искать ошибку.

Для изменения прав на объект используется std::move

1
2
3
unique_ptr<string> p1(new string("Hello"));
unique_ptr<string> p2;
p2 = std::move(p1);

Как для std::auto_ptr так и для shared_ptr есть методы для сброса прав указателя reset(), для возвращения классического указателя используется метод get().

Подробнее:

std::unique_ptr – умный указатель, который: получает единоличное владение объектом через его указатель, и разрушает объект через его указатель, когда unique_ptr выходит из области видимости.
unique_ptr не может быть скопирован или задан через операцию присвоения, два экземпляра unique_ptr не могут управлять одним и тем же объектом. Неконстантный unique_ptr может передать владение управляемым объектом другому указателю unique_ptr. const std::unique_ptr не может быть передан, ограничивая время жизни управляемого объекта областью, в которой указатель был создан. Когда unique_ptr уничтожается, он удаляет объект с помощью Deleter.
Существует две версии std::unique_ptr:

1) управляет временем жизни одного объекта, например, созданного с помощью оператора new
2) управляет временем жизни массива, с длиной, определенной во время выполнения, созданного с помощью new[]

Типичные случаи применения std::unique_ptr включают:
обеспечение безопасности исключений для классов и функций, которые управляют объектами с динамическим временем жизни, гарантируя удаление в случае нормального завершения и завершения по исключению передача владения динамически созданным объектом в функции
получение владения динамически созданным объектом из функций в качестве типа элемента в контейнерах, поддерживающих семантику перемещения, таких как std::vector, которые хранят указатели на динамически выделенные объекты (например, если желательно полиморфное поведение)

Ссылка: http://ru.cppreference.com/w/cpp/memory/unique_ptr

***

std::shared_ptr - самый часто используемый интеллектуальный указатель. Несколько указателей данного класса могут ссылаться на один объект. std::shared_ptr - ведёт подсчёт ссылок на используемый ресурс. Ресурс освободится когда количество ссылок указателя будет равно 0.
Для просмотра количества ссылающихся указателей используется функция: std::shared_ptr.use_count()


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <iostream>
#include <memory>
using namespace std;

int main(int argc, char *argv[])
{
    shared_ptr<int> ptr1(new int(66));
    shared_ptr<int> empty_ptr;
    empty_ptr = ptr1;

    cout << empty_ptr.use_count();  // Выведет 2;
    return 0;
}

Для создания объектов на лету следует использовать фабричную функцию   std::make_shared<T>. Создает объект типа T и оборачивает его в std::shared_ptr использованием args как список параметров для конструктора T.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <iostream>
#include <memory>

void foo(std::shared_ptr<int> i)
{
    (*i)++;
}

int main()
{
    auto sp = std::make_shared<int>(10);
    foo(sp);
    std::cout << *sp << std::endl;
}

***

std::weak_ptr – умный указатель, который содержит "слабую" ссылку на объект, управляемый указателем std::shared_ptr. Он должен быть преобразован в std::shared_ptr, чтобы получить доступ к управляемому объекту.
Данный указатель позволяет решить проблему перекрёстных ссылок:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <memory>
using namespace std;

struct Foo
{
    shared_ptr<Foo> otherFoo;
};

void f()
{
    shared_ptr<Foo> a(new Foo);
    shared_ptr<Foo> b(new Foo);

    a->otherFoo = b;
    b->otherFoo = a;
    cout << a.use_count() << " : " << b.use_count(); 2 : 2
}

int main()
{
    f();
    return 0;
}

Что произойдет при выходе объектов a и b из области определения? В деструкторе уменьшатся ссылки на объекты. У каждого объекта будет счетчик = 1 (ведь a все еще указывает на b, а b — на a). Объекты “держат” друг друга и у нашего приложения нет возможности получить к ним доступ — эти объекты “потеряны”.
Для решения этой проблемы существует weak_ptr. Одним из типичных случаев создания перекрестных ссылок является случай, когда один объект владеет коллекцией других объектов.
Заменяем указатель на std::weak_ptr и проблема решена.


1
2
3
4
struct Foo
{
    weak_ptr<Foo> otherFoo;
};




пятница, 13 января 2017 г.

Доступ к свойствам QML объекта загруженного через QQmlApplicationEngine из C++


Доступ с свойствам QML объекта из C++


QObject *rootObject = engine.rootObjects().first(); - доступ к корневому элементу.

QObject *qmlObject = rootObject->findChild<QObject*>("mainWindow"); - доступ к элементу по имени относительно корневого элемента.

C++ side

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
 
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
 
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
 
    // Step 1: get access to the root object
    QObject *rootObject = engine.rootObjects().first();
    QObject *qmlObject = rootObject->findChild<QObject*>("mainWindow");
 
    // Step 2a: set or get the desired property value for the root object
    rootObject->setProperty("visible", true);
    qDebug() << rootObject->property("visible");
 
    // Step 2b: set or get the desired property value for any qml object
    qmlObject->setProperty("visible", true);
    qDebug() << qmlObject->property("visible");
 
    return app.exec();
}

QML side

import QtQuick 2.2
import QtQuick.Window 2.1

Window {
    id: mainWindow
    objectName: "mainWindow"
    ...
}

Ссылка: http://stackoverflow.com/questions/23177839/how-can-i-access-my-window-object-properties-from-c-while-using-qqmlapplicatio




вторник, 19 января 2016 г.

swf to html5 converter

Swf to Html5 converter. 

Download from google disk:

Download from yandex disk:

Unzip archive and run program.


load adobe flash files (*.swf) from folder and start convert.




on the output you get your html5 files on the same folder where swf files. After insert files where you want.