Skip to content

Instantly share code, notes, and snippets.

@tintera
Last active November 20, 2015 11:39
Show Gist options
  • Save tintera/0629fdefeeffd9b9fc32 to your computer and use it in GitHub Desktop.
Save tintera/0629fdefeeffd9b9fc32 to your computer and use it in GitHub Desktop.
#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