Underused C++ Features

AGGROStar1991

Well-Known Member
c-b Experte
#1
Hey zusammen!

C++ ist eine riesige Sprache und sie wird immer größer und in Teilen abgefahrener. Darum möchte ich mit euch eure liebsten Features von Sprache und Standardbibliothek(natürlich mit STL ;)) sammeln von denen ihr findet dass andere die deutlich mehr benutzen oder kennen sollten.
Gummi-Bonuspunkte und Bragging-rights gibt es natürlich für unbekannte Features(oder besonders kreative Nutzung) und Beispielcode :)

Ich fange vielleicht einmal an mit constexpr- lambdas :

C++:
inline constexpr auto ret = ()[] constexpr -> auto {
    // lots of computation with a return here
}();
Warum sind Constexpr-Lambdas cool? Weil sie zur Compilezeit ausgewertet werden! Das heißt es ist möglich, wie in dem gezeigten Code, eine constexpr-Variable mit dem Ergebnis einer Funktion zu initialisieren. Aber das ist eigentlich immernoch langweilig. Geht das auch im Körper eines Templates? Jup! Ich kann beispielsweise sogar Funktionstemplates auf diese Art dynamisch generieren(ich benutze ein constexpr-lambda das selbst ein lambda zurück gibt). Und das Beste : das alles geht komplett ohne Template-Rekursion oder template<class T, class T>-Branching(schaut euch mal den code für numeric_limits an und überlegt euch wie herrlich das wäre, wenn der stattdessen aus ein paar Funktionen mit switches und ifs bestehen könnte).

Ich hoffe auf rege Beteiligung!
 

Zhavok

Well-Known Member
#2
Sehr schöne Idee *Thumbs up*.
Vielleicht kann ich mit meinem Amateuerwissen auch etwas dazu beitragen.

Da ich immer wieder für Zufallszahlen so etwas lese wie rand() oder ähnliches möchte ich zunächst mal ein Beispiel zeigen wie man in C++ relativ simpel Zufallszahlen erzeugen kann. Das dient also eher für Anfänger^^. <random> sollte nicht für Kryptoverfahren verwendet werden!!!

Für einzelne Zufallszahlen
C++:
std::random_device rd;
int random{ std::uniform_int_distribution<int>{ 1, 9 }(rd) };
Für einen std::vector mit Zufallszahlen:
C++:
std::vector<int> vec(10);
std::random_device rd;
std::generate(vec.begin(), vec.end(), [&]() { return std::uniform_int_distribution<int>{ 1, 9 }(rd); });
Die 1 und 9 stehen hierbei für die Grenzen. Also Zufallszahlen von 1 bis 9. Für die Zufallsklassen muss <random> included werden. Für std::generate <algorithm>.


Bei Vectoren habe ich häufiger gesehen, dass Leute die Aufgabe haben die einzelnen Elemente mit den Elementen eines anderen Vectors zu addieren. Meistens habe ich dann Lösungen mit Schleifen gesehen. Das Problem lässt sich auch ganz einfach mit der STL lösen:
C++:
#include <iostream>
#include <random> //std::random_device & std::uniform_int_distribution
#include <numeric> //std::iota
#include <functional> //std::plus
#include <algorithm> // std::transform & std::generate

void fillRandom(std::vector<int> &vec) {
    std::random_device rd;
    std::generate(vec.begin(), vec.end(), [&]() { return std::uniform_int_distribution<int>{ 1, 9 }(rd); });
}

void printVec(const std::vector<int> &vec) {
    for (const auto &number : vec) {
        std::cout.width(2);
        std::cout << number << "|";
    }
    std::cout.put('\n');
}

int main() {
    constexpr int size{ 5 };

    std::vector<int> vec1(size);
    std::iota(vec1.begin(), vec1.end(), 0); //Fülle den Vector mit Zahlen von 0 beginnend

    std::vector<int> vec2(size);
    fillRandom(vec2); //Fülle den Vector mit Zufallszahlen

    std::vector<int> vec3(size);
    std::transform(vec1.begin(), vec1.end(), vec2.begin(), vec3.begin(), std::plus<int>()); //Vectoren addieren

    printVec(vec1);
    printVec(vec2);
    printVec(vec3);
}
Zu std::plus<> gibts natürlich noch Alternativen (std::minus<>, std::multiplies<> und std::divides)


Und dann fällt mir gerade noch ein, das schnelle Einlesen von simplen structs:
C++:
#include <iostream>
#include <string>

struct MyStruct {
    int number;
    char character;
    std::string str;
};

int main() {
    MyStruct stru{ 7, 'f', "Hello World" };
    auto [a, b, c] { stru };

    std::cout << a << " / " << b << " / " << c << "\n";
}
Ich hoffe ich hab nicht zuviel Käse geschrieben :rolleyes:. Bitte berichtigt mich bei Fehlern ;)
 

AGGROStar1991

Well-Known Member
c-b Experte
#4
Ich finde das Fehlen von contracts bisher noch etwas bitter, erst damit hätten die so richtig Spaß gemacht. Aber nun wollen wir tollen( von dir stammenden :p) Beispielcode sehen ;)

Weil ich mein Clang kann das afaik schon, und ich hab es noch nie live gesehen... Also ists underused^^
 
Oben