30 stycznia 2020

[C++] std::valarray

Ciekaw struktura danych, z której nigdy do tej pory nie korzystałem. std::valarray pozwala na przeprowadzanie operacji matematycznych dla wszystkimi elementami tablicy jednocześnie. Coś w rodzaju NumPy znanego z Python-a.
W przykładzie poniżej, wszystkie elementy tablicy zostały przemnożone przez 10, a następnie zostały zsumowane.
#include <iostream>
#include <valarray>

using namespace std;

int main() {
    std::valarray<int> va{1, 2, 3};

    va *= 10;

    for(const auto& v : va) {
        cout << v << " ";
    }

    cout << endl << va.sum() << endl;
}
Wynik:
10 20 30 
60
valarray oferuje jeszcze kilka innych klas pomocniczych m.in. std::slice, podobne do tego znanego z Python-a.

Działanie slice znane z Python-a:
for (i = start; i < end; i += step)
    append(i)
Wersja std::slice w C++. Moim zdaniem mechanizm ten jest mniej wygodny i mniej intuicyjny.
for (i = start, j = 0; j < size; i += step, j++)
   append(i)
std::valarray posiada również mechanizm znany z NumPy jako "Indexing with Boolean Arrays". To akurat działa bez zarzutu.
#include <iostream>
#include <valarray>

using namespace std;

int main() {
    std::valarray<int> va = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    auto sub_va = std::valarray<int>{va[std::slice{0, va.size()/2, 2}]};
    for (const auto& v : sub_va) {
        cout << v << " ";
    }
    cout << endl;

    va[va > 5]  = -1;
    for (const auto& v : va) {
        cout << v << " ";
    }
}
Wynik:
0 2 4 6 8 
0 1 2 3 4 5 -1 -1 -1 -1

18 stycznia 2020

Nowości w języku C (C11/C18)

Dwa ciekawe wykłady Dana Saksa na temat nowości w standardzie języka C (np. funkcje inline jako zamienniki makr).



A także o odwrocie od C++ w środowisku embedded (na konferencji CppCon 2016).