Djup/ytlig kopiering av containrar med referensobjekt

Relevanta dokument
Djup/ytlig kopiering av containrar med referensobjekt. Allmänt. Vad ska container innehålla?

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Classes och Interfaces, Objects och References, Initialization

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 3. Stack

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Länkade strukturer. (del 2)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

Datastrukturer. föreläsning 3. Stacks 1

Kopiering av objekt i Java

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Arrayer. results

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Tillämpad programmering

Generisk klass med typparameter Inre klass - ListIterator

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

maxlist-1. Indexerad lista Länkad lista

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Föreläsning 4 Innehåll

Föreläsning 3. Stack

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

DAT043 - föreläsning 8

Tentamen Programmering fortsättningskurs DIT950

Föreläsning 2. Länkad lista och iterator

Föreläsning Datastrukturer (DAT036)

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Föreläsning 2 Datastrukturer (DAT037)

List.java. List.java. Printed by Tom Smedsaas

1. Klass med en dynamiskt allokerad variabel, definitionsfilen-del Klass med en dynamiskt allokerad variabel, inkluderingsfilen.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC76 - Programmering och Datastrukturer

Föreläsning 12. Länkade listor

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Föreläsning 3 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

TDDD78 Viktiga begrepp, del 2

Föreläsning 2. Länkad lista och iterator

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

Lösningsförslag övning 2.

TDIU01 Programmering i C++

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

Den som bara har en hammare tror att alla problem är spikar

Föreläsning Datastrukturer (DAT036)

Föreläsning 3 Datastrukturer (DAT037)

Generiska konstruktioner. Kursbokens kapitel 13

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen i Algoritmer & Datastrukturer i Java

Datastrukturer och algoritmer

Föreläsning 10. ADT:er och datastrukturer

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

TDDC74 Programmering: Abstraktion och modellering Dugga 3, kl 14 16, 25 mars 2015

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Synlighet. Namespace Scope-operatorn Klasser Vänner

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

Repetition av OOP- och Javabegrepp

TDDC74 Programmering, abstraktion och modellering DUGGA 2

CHALMERS TENTAMEN. 2018/2019, lp 1 DAT050. Uno Holmer

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

Objektorienterad programmering i Java

Datastrukturer och algoritmer

Repetition av OOP- och Javabegrepp

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Transkript:

Djup/ytlig kopiering av containrar med erensobjekt

Allmänt Om man inte vet hur många objekt man kommer behöva under exekvering så måste dynamiska lagringsstrukturer användas. stack, kö, lista, träd osv är alla containrar som kan hantera en mängd objekt. Containrar och Referensobjekt, Sida2

Vad ska container innehålla? Värden Ett värde kan beskrivas med en instans av någon typ. Själva instansen som sådan har inte något mervärde. Containern ansvarar för instansernas livslängd. Objekt Listan innehåller signifikanta erenser till objekt, m.h.a. pekare. Containern ansvarar inte för objektens livslängd, bara pekarens. Valet av innehåll är till mycket beroende på användningsfallet. Det kommer även att spegla semantiken för flera operatorer och funktioner: = operatorn för container Copy-construktorn Eventuella clone() funktioner. operator[] och ev get-funktioner Containrar och Referensobjekt, Sida3

Delade containrar Semantiken för operatorn = och copy-constructorn behöver specificeras. Lista L1, L2, L2 = L1; eller.. Lista &L3 = *(new Lista(L1)); Frågor angående den semantiska innebörden hos operator = 1. Ska L1 och L2 vara samma lista för alla framtid? 2. Ska de vara identiska men inte har några kopplingar sinsemellan och för all framtid vara skilda listor? 3. Ska de vara samma lista tills någon av de två förändras? Vilken förändring är signifikant? Ändringar i listans värden och/eller listans objekt. Till vilken nivå ska objekt delas? Containrar och Referensobjekt, Sida4

Delade containrar Om två listor delar på innehållet utnyttjas mindre minne, Bra för små datorer/enheter. Gäller endast containrar som innehåller värden. Relationen mellan de två listorna måste underhållas kontinuerligt under listornas livslängd, genererar overhead. Den mer omfattande kopieringen, djup kopiering, görs under användningen, när listorna inte längre ska dela ett eller flera objekt. Containrar och Referensobjekt, Sida5

operator =: Semantik Semantik för Operator = och copy-construktorns Ytlig kopiering. Djup kopiering kan beroende av design framtvingas då: Listans storlek förändras, ett element tas bort eller läggs till. Då instanser i listan byter värde, men ska detta tillåtas? Ska listans objekt exponeras för omvärlden? Ja: Vi måste utföra en djupkopiering innan erensen ges ut. Nej: - Containrar och Referensobjekt, Sida6

Exempel: djup och ytlig kopiering Stack a, b; //... a.push(elm1); a.push(elm2); //... b = a; //b pekar på samma stack som a - YTLIG kopiering b.pop(); //b måste nu skapa en //EGEN kopia av a s stack - DJUP kopiering Containrar och Referensobjekt, Sida7

Referensobjektet (Mönster: Handle-Body ) Utan erensobjekt är ytlig kopiering omöjlig. Ett erensobjekt används som ett mellanlager, mellan användare och objekt/objektstruktur. Ett erensobjektet 1. Håller reda på hur många containrar som ererar till objektet. 2. Ska eventuellt utföra djupkopiering, beroende på design. Användandet av erensobjekt kan göras med varierande omfattning, beroende av vilka objekt som ska delas. Nivå 1: Ett erensobjekt per objektstruktur. Innehållet delas inte vid djup kopiering. Nivå 2: Ett erensobjekt per värde-objekt i containern. Containrar och Referensobjekt, Sida8

Illustration av nivå 1 och 2 Lista 1 Data Nod Lista 1 Nod Data Ytlig kopiering Ytlig kopiering Lista 1 Lista 1 Lista 2 Djup kopiering Lista 2 Djup kopiering Lista 1 Lista 1 Lista 2 Lista 2 Containrar och Referensobjekt, Sida9

Illustration av nivå 1 och 2 Forst. Nivå 1 Nivå 2 Lista 1 Lista 1 Lista 2 Lista 2 Destroy Lista 1 Destroy Lista 1 Lista 2 Lista 2 Containrar och Referensobjekt, Sida10

Nivå 1: Referensklassen T Handle Counter : int body : T* getdata() : T* Containrar och Referensobjekt, Sida11

Nivå 1, Referensklassen Krav på användaren/listan. Uppdatera erensräknaren beroende på om den vill peka på objektet/objektstrukturen eller inte. Om containern förändrar objektet/objektstrukturen så ska den göra: Om det finns flera containrar som pekar på den aktuella erensen, ska den skapa ett nytt erensobjekt som pekar på det nya objektet/en (kopian plus förändringen). Slutligen koppla ifrån sig från det gamla och räkna ner dess erensräknare. Om det inte finns mer containrar knutna hos erensklassen kan containern uppdatera objektet direkt. Krav på erensobjektet Inga direkta. Allt sköts av användaren. Containrar och Referensobjekt, Sida12

Nivå 2: Referensklassen T Handle Counter : int* body : T* getdata() : T* Containrar och Referensobjekt, Sida13

Nivå 2, Referensklassen Krav på användaren/listan. Inga Allt ska ske automatiskt Krav på erensobjektet Många Tilldelning av erensobjekt Kopiering av erensobjekt Djup kopiering? Design fråga.. Containrar och Referensobjekt, Sida14

Referensobjekt: För och nackdelar En omfattande användning av erensobjekt komplicerar det hela. Kanske till och med slår ut fördelarna angående effektivitet. När är man villig att betala kostnaden för att underhålla erensobjekten? Vad kostar minst, minne eller beräkningskraft? Man bör undersöka om man verkligen behöver erensobjekt. Hur många ska dela samma lista? Vad blir vinsten i minnesanvändning? Containrar och Referensobjekt, Sida15

Containrar och Referensobjekt, Sida16 template <class T> class Snode {//node friend class Stack<T>; friend class StackIterator<T>; public: Snode():data(NULL){next = NULL;} Snode(T& elm):data(elm){next = NULL;} ~ Snode(){} T& getdata(){return data;} private: Snode<T>* next; //pekar på nästa //element i Stacken T data; //data som ska lagras i Stacken }; template <class T> class StackRef{ //Referensklass för noder. friend class Stack<T>; friend class StackIterator<T>; public: StackRef(T*); ~StackRef(); private: int count_stack; //erensräknare T* obj; // erens till objektet }; Kodexempel: Stack+erens pekare

Containrar och Referensobjekt, Sida17 template <class T> class Stack{ //the stack itself public: Stack(); //default cons. Stack(const Stack<T>&); //copy cons. ~Stack(); //destructor void push(t& data); //add elm in Stack T& pop(); //remove elm on top T& top(); //peak elm from top Stack<T> operator=(const Stack<T>&); private: StackRef<Snode<T>>* stack_; int count_elm; //number of elments in Stack }; template <class T> Stack<T>::Stack(const Stack<T>& stk){ //point to same Reference //assign equal number of elements //increament pointers to erence } template <class T> Stack<T>::~Stack(){ /*disconnect myself if it's only my data & //destroy all stackelm //destroy */ } Kodexempel: Stack+erens pekare