C++11

Példaprogramok

multimap::equalrange()

Ez a példaprogram a multimap equalrange() függvényének használatán keresztül mutatja be a nyelv újdonságait. A példakód eredetije C++03-ban íródott, amely megtalálható a cplusplus.com-on.

A példakód C++03-ban megírt változata:

#include #include using namespace std; int main () { multimap mymultimap; multimap::iterator it; // insert some values: mymultimap.insert(pair('a',10)); mymultimap.insert(pair('b',20)); mymultimap.insert(pair('b',30)); mymultimap.insert(pair('c',40)); mymultimap.insert(pair('d',50)); mymultimap.insert(pair('d',60)); mymultimap.insert(pair('e',70)); mymultimap.insert(pair('f',80)); it=mymultimap.find('b'); mymultimap.erase (it); // erasing by iterator (1 element) mymultimap.erase ('d'); // erasing by key (2 elements) it=mymultimap.find ('e'); mymultimap.erase ( it, mymultimap.end() ); // erasing by range // show content: for ( it=mymultimap.begin() ; it != mymultimap.end(); it++ ) cout << (*it).first << " => " << (*it).second << endl; return 0;

A példakód C++11-ben megírva:

#include #include #include using namespace std; int main () { const multimap mymm = { {'a',10}, {'b',20}, {'b',30}, {'b',40}, {'c',50}, {'c',60}, {'d',60} }; cout << "mymm contains:\n"; for (char ch='a'; ch<='d'; ch++) { cout << ch << " =>"; auto ret = mymm.equal_range(ch); for_each(ret.first, ret.second, [](pair e){ cout << " " << e.second; } ); cout << endl; } return 0; }

Forrás

Bill parser

A program egy szöveges formátumban kapott számlát parse-ol egy számla objektumba, reguláris kifejezések használatával.

A program a C++11 új regexp szabványos könyvtárának használatát hivatott demózni.

A Gcc 4.7-es változata még nem teljes mértékben implementálja a regexp library-t, a reguláris kifejezésekben megadott karakterosztályok, illetve '[ ]' között megadott karakterhalmazok futási idejű hibát eredményeznek. (2012 júniusi állapot.)

// ... regex rmId (R"DELIM(^.+ Invoice (SML-(\w|-)+).*$)DELIM"); // ... auto it = text.cbegin(); Bill bill = Bill(); while(!regex_match(*it, rmId)) { ++it; if (text.end() == it) { // the parsed bill has a wrong format return bill; } } bill.id = regex_replace(*it, rmId, string("$1")); // ...

Forrás

Példaprogramok Conceptekre

A következő példaprogramok a készülő szabvány concept-ekre vonatkozó terveit mutatják be. Az új szabványba végül nem kerültek bele ezek a feature-ök, gy ezek a példakódok sem szabványos C++11 kódok!

MyArray osztály

class OutOfRange: public std::exception {}; template class MyArray { public: MyArray() {} MyArray(const std::initializer_list& init) //initializer list constructor: MyArray<5, int> mya = {0, 1, 2, 3}; { for(int i(0); i concept_map Range> //no ' ' in >> { typedef T* range_iterator::type; typedef T value_type; //begin and end are correct }; /* * Describing how MyArray fulfills Container concept's restrictions, * so it can be used in standard algorithms efficiently */ template concept_map Container> { typedef T value_type; typedef T* iterator; typedef const T* const_iterator; typedef T& reference; typedef const T& const_reference; //... more types //begin, end correct bool empty() //array is always full -> never empty { return false; } unsigned size() //its size is always its maximum { return size; } unsigned max_size() { return size; } }

Forrás

Mátrix osztály

/* * Defining a concept so we can work with T as numbers * We reuse the LessThanComparable standard concept to reduce complexity */ auto concept Number { T operator+(const T&, const T&); T& operator+=(T&, const T&); //... }; /* * Type param fulfills Number concept */ template class Matrix { public: Matrix(unsigned row, unsigned col): row(row), col(col) { Create(); } /* * Rvalue constructor: efficient copying of temporaly objects */ Matrix(Matrix&& oth): row(oth.Row()), col(oth.Col()) { Create(); T** tmp = matr; matr = oth.matr; oth.matr = tmp; } ~Matrix() { for(int i(0); i<row; ++i) delete[] matr[i]; delete[] matr; } /* * Type parameter can be called by operator(), maybe through concept_map */ template void Apply(Func func) { for(int i(0); i<row; ++i) for(int j(0); j<row; ++j) func(matr[i][j]); } T& operator()(unsigned r, unsigned c) { return matr[r][c]; } inline Row() const { return row; } inline Col() const { return col; } private: T** matr; unsigned row, col; void Create() { matr = new T[row]; for(int i(0); i<row; ++i) matr[i] = new T[col]; } };

Forrás