LINUX.ORG.RU

История изменений

Исправление Kroz, (текущая версия) :

В case 1 была показана работа простыми операторами со сложным типом - строкой. На самом деле ты такое можешь конструировать для любого типа. Для стандартных типов это скорее вред, чем польза, а вот для своих кастомных типов может существенно облегчить чтение кода.

Внизу примеры чуть неправильные (я ж говорил, что лучше этого не делать для стандартных типов), но отражают суть.

Еще в примера показана работа с массивами. Опять же - все динамически выделяется и высвобождается, вся работа с памятьью организована стандартной библиотекой.

Пример 1: «плюс» означает конкатенацию массивов:

#include <iostream>
#include <vector>

using namespace std;

vector<int> operator+(vector<int> &a, vector<int> &b)
{
        vector<int> r(a);

        r.insert(r.end(), b.begin(), b.end());

        return r;
}


int main()
{
        vector<int> v1 = {1, 2, 3};
        vector<int> v2 = {4, 5, 6};
        vector<int> v3;

        v3 = v1 + v2;

        cout << "Vector content: ";
        for (auto e: v3)
                cout << e << " ";
        cout << endl;
		
        return 0;
}
$ g++ ./cpp_vector_merge.cpp && ./a.out
Vector content: 1 2 3 4 5 6

Пример 2: «плюс» означает сумму элементов массивов:
#include <iostream>
#include <vector>

using namespace std;


vector<int> operator+(vector<int> &a, vector<int> &b)
{
        vector<int> r;
        auto i_b = b.begin();

        for (auto e_a: a)
                if (i_b != b.end())
                        r.push_back(e_a + *i_b);

        return r;
}


int main()
{
        vector<int> v1 = {1, 2, 3};
        vector<int> v2 = {4, 5, 6};
        vector<int> v3;

        v3 = v1 + v2;

        cout << "Vector content: ";
        for (auto e: v3)
                cout << e << " ";
        cout << endl;
		
        return 0;
}
$ g++ ./cpp_vector_add.cpp && ./a.out
Vector content: Vector content: 5 6 7

Исходная версия Kroz, :

Case 2: Перегрузка операторов

В case 1 была показана работа простыми операторами со сложным типом - строкой. На самом деле ты такое можешь конструировать для любого типа. Для стандартных типов это скорее вред, чем польза, а вот для своих кастомных типов может существенно облегчить чтение кода.

Внизу примеры чуть неправильные (я ж говорил, что лучше этого не делать для стандартных типов), но отражают суть.

Еще в примера показана работа с массивами. Опять же - все динамически выделяется и высвобождается, вся работа с памятьью организована стандартной библиотекой.

Пример 1: «плюс» означает конкатенацию массивов:

#include <iostream>
#include <vector>

using namespace std;

vector<int> operator+(vector<int> &a, vector<int> &b)
{
        vector<int> r(a);

        r.insert(r.end(), b.begin(), b.end());

        return r;
}


int main()
{
        vector<int> v1 = {1, 2, 3};
        vector<int> v2 = {4, 5, 6};
        vector<int> v3;

        v3 = v1 + v2;

        cout << "Vector content: ";
        for (auto e: v3)
                cout << e << " ";
        cout << endl;
		
        return 0;
}


Пример 2: «плюс» означает сумму элементов массивов:
#include <iostream>
#include <vector>

using namespace std;


vector<int> operator+(vector<int> &a, vector<int> &b)
{
        vector<int> r;
        auto i_b = b.begin();

        for (auto e_a: a)
                if (i_b != b.end())
                        r.push_back(e_a + *i_b);

        return r;
}


int main()
{
        vector<int> v1 = {1, 2, 3};
        vector<int> v2 = {4, 5, 6};
        vector<int> v3;

        v3 = v1 + v2;

        cout << "Vector content: ";
        for (auto e: v3)
                cout << e << " ";
        cout << endl;
		
        return 0;
}