Djup/ytlig kopiering av containrar med referensobjekt. Allmänt. Vad ska container innehålla? 2004-05-10



Relevanta dokument
Djup/ytlig kopiering av containrar med referensobjekt

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

Classes och Interfaces, Objects och References, Initialization

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 2 Datastrukturer (DAT037)

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

Föreläsning 3. Stack

Länkade strukturer. (del 2)

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

Datastrukturer. föreläsning 3. Stacks 1

Kopiering av objekt i Java

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..

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

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

Arrayer. results

Generisk klass med typparameter Inre klass - ListIterator

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

Tillämpad programmering

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

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

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

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

maxlist-1. Indexerad lista Länkad lista

Föreläsning 4 Innehåll

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

Lösningsförslag övning 2.

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

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

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)

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

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

Föreläsning 3 Datastrukturer (DAT037)

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

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

TDDC76 - Programmering och Datastrukturer

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

Tentamen i Algoritmer & Datastrukturer i Java

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

Föreläsning 3. Stack

TDDD78 Viktiga begrepp, del 2

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

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

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

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)

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

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

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

TDIU01 Programmering i C++

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

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

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

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

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

Föreläsning Datastrukturer (DAT036)

Föreläsning 3 Datastrukturer (DAT037)

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

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 12. Länkade listor

Datastrukturer och algoritmer

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

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

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

Objektorienterad programmering i Java

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

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

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

Datastrukturer och algoritmer

Repetition av OOP- och Javabegrepp

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen Datastrukturer, DAT037 (DAT036)

Tentamen. Programmeringsmetodik, KV: Java och OOP. 20 januari 2005

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

OOP Objekt-orienterad programmering

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Innehåll. Pekare Exempel

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

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, 1

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, 2

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 Data Nod Nod Data Ytlig kopiering Ytlig kopiering Djup kopiering Djup kopiering Containrar och Referensobjekt, Sida9, 3

Illustration av nivå 1 och 2 Forst. Nivå 1 Nivå 2 Destroy Destroy 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, 4

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, 5

, 6 Containrar och Referensobjekt, Sida17 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 }; Stack<T>::Stack(const Stack<T>& stk){ //point to same Reference //assign equal number of elements //increament pointers to erence } Stack<T>::~Stack(){ /*disconnect myself if it's only my data & //destroy all stackelm //destroy */ } Kodexempel: Stack+erens pekare Containrar och Referensobjekt, Sida16 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 }; 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 2004-05-10