Last active
November 20, 2015 11:39
-
-
Save tintera/0629fdefeeffd9b9fc32 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "stdafx.h" | |
// Překvapení C++ pro programátory v Javě a C#. Platí i v roce 2015 a C++ 14. | |
// Číslo 3 - předání parametru. Pole vs. vektor. | |
// Poučení z diskusí: nepoužívejte to cčkové pole. Pouze vector z C++. | |
#include <iostream> | |
#include <vector> | |
#include <iostream> | |
using namespace std; | |
//notes: reat the main function first | |
typedef int bookIDs[]; // definuji typ - pole čísel | |
typedef vector<int> readerIDs; // definuji typ - vektor čísel | |
void dangerous_fnc(readerIDs readers, bookIDs books) { | |
//vector readerIds je kopie předávaného objektu. | |
//Stále mám k dispozici zjistit jeho velikost | |
auto rs = readers.end(); | |
//zapíšu poouze do kopie, ve odkud byla tato funkce zavolána se následujcí změna neporojeví | |
readers[2] = 300; | |
//a projít jeho prvky | |
wcout << "Readers: dangerous_fnc: "; | |
for (auto readerID : readers) { | |
wcout << readerID << " "; //vypíše na konzolu 21 22 300 | |
} | |
wcout << endl; | |
//Pole se předá jako pointer. Nekopíruje se a nefungují některé jeho vlastnosti. | |
//auto bb = end(books); //nezkompiluje se, protože pole int[] je po předání do funkce už pointer int* | |
// for (auto bookID : books) { //this range - based 'for' statement requires a suitable "begin" function and none was found | |
// wcout << bookID << " "; | |
// } | |
//do pole mohu také zapsat a tato změna se, pro změnu, v místě volání projeví | |
books[2] = 222; | |
return; | |
} | |
template<class ITER> | |
void correct_fnc(ITER begin, ITER end) { | |
// Standardní je použít iterátory. Fungují pro obojí, ale kód funkce je hůže čitelný | |
wcout << "correct_fnc: "; | |
for (ITER iter = begin; iter != end; iter++) { | |
wcout << (*iter) << " "; //vypíše na konzolu prvky pole | |
} | |
wcout << endl; | |
} | |
template<class Container> | |
void single_use_fnc(Container container) { | |
//Doporučované je používat pouze C++kové containery a nepoužívat staré Cčkové struktury | |
//Při použit bez iterátorů ovšem mizí flexibilita. Tato funkce nedává možnost vypsat jen část kontaineru | |
//nebo předat třeba interátor jdoucí pozpátku nebo vynechávající některé prvky | |
wcout << "single_use_fnc: "; | |
for (auto item : container) { | |
wcout << item << " "; //vypíše na konzolu prvky pole | |
} | |
wcout << endl; | |
} | |
//Podrobněji v C++ primer, 5té vydání. s. 214-218 http://www.amazon.com/gp/product/0321714113/ | |
//Uff 3 stránky perfektní hutné knihy na předání jednodimenzionálního pole. A komunita doporučuje | |
//ho vůbec nepoužívat. | |
//Ukázka volání jednotliových funkcí | |
int main() | |
{ | |
bookIDs myBooks = { 21, 22, 23 }; //zde není poznat, co je staré Cčkové pole a co C++ kontejner. | |
readerIDs myReaders = { 11, 12, 13 }; | |
//s obojím pracuji jako s polem | |
//zápis prvku pole | |
auto secondReader = myReaders[2] = 10; | |
auto secondBook = myBooks[2] = 20; | |
//procházení polem v jednoduchém zápisu z C++ 11 | |
wcout << "Books : global:"; | |
for (auto bookID : myBooks) { | |
wcout << bookID << " "; //vypíše na konzolu 21 22 20 | |
} | |
wcout << endl; | |
wcout << "Readers: global:"; | |
for (auto readerID : myReaders) { | |
wcout << readerID << " "; //vypíše na konzolu 21 22 20 | |
} | |
wcout << endl; | |
//ale pozor při předání "hodnotou" do funkce. Pole může být je ve funkci změněno, vektor ne | |
dangerous_fnc(myReaders, myBooks); | |
//knihovní funkci vytvořit nejlépe takto // flexibilní, funkční pro nové C i C++ struktury | |
wcout << "Books : "; | |
correct_fnc(begin(myBooks), end(myBooks)); | |
wcout << "Readers: "; | |
correct_fnc(myReaders.begin(), myReaders.end()); | |
//jednoduchá funkce je optimální na jedno použití, ale nehodí se do knihovny a k opakovanému použití | |
wcout << "Readers: "; | |
single_use_fnc(myReaders); | |
//a nejlépe s v coding style zakázat staré Cčkové struktury a používat jen ty C++ only. | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment