Dla mojego GUI muszę klasę z następujących celów zarządzania kontrolnej (okien, przycisków itp)Jak utworzyć bezpieczny pojemnik do kopiowania za pomocą std :: list iteratorów przechowywanych w standardzie w C++?
- swobodny dostęp do elementów przez
[index]
- losowego dostępu do elementów przez
["key"]
- stabilność wskaźnika , więc
ptr=&container[index]
nic nie zmieni, jeśli elementy zostaną dodane lub usunięte - skopiować bezpieczeństwo. Wszystkie elementy muszą zostać zapisane w kontenerze i skopiowane, jeśli "=" jest używane tak jak
container2=conatiner1
(deep-copy) - kolejność elementów na liście musi być możliwa do zmiany, ale wskaźniki do elementów muszą pozostać poprawne. Jeśli
ptr1=container[1]
iptr2=container[2]
, to po zamianie rzędu 1 i 2,ptr1==container[2]
iptr2==container[1]
doszedłem do wniosku, że std :: Lista zapewnia stabilność dla wskaźników, które muszę i std :: vector losowego dostęp. Więc mam pomysł przechowywania krotki std string i iteratora w wektorze. Jednak iteratory są nieważne po skopiowaniu kontenera.
Jakieś sugestie, jak najlepiej rozwiązać ten problem?
Tutaj główny kod z obecnego podejścia (tylko ważne elementy są w zestawie):
template < class T >
class ControlList
{
struct Tuple{std::string first;typename std::list<T>::iterator second;};
std::vector<Tuple> list;
std::list<T> objects;
inline T& operator [](int i)
{
return *list[i].second;
}
inline T& operator [](std::string s)
{
loopi(0,vlist.size())
if(s==vlist[i].first)
return *vlist[i].second;
}
}
Dostęp ciąg jest powolny, ale zazwyczaj pojemnik ma nie więcej niż 10 elementów i jego używane rzadko w programie .
Aktualizacja:
Wspólna wskaźnik jest już dobrze, ale nie da się rozwiązać za głębokiej kopii muszę. Powiedzmy, że mam window2 = window1. Teraz, jeśli mam wspólny wskaźnik, naciśnięcie przycisku w oknie 2 powoduje również naciśnięcie tego samego przycisku w oknie 1, które nie jest pożądane. Naprawdę potrzebuję nowej instancji wszystkich obiektów zawartych w kontenerze.
Czy możliwe jest zastąpienie konstruktora kopii w celu utworzenia nowych wystąpień obiektów przywoływanych przez inteligentne wskaźniki?
Zarówno okna i przyciski są przechowywane w pliku ControlList
, w którym okno zawiera wiele list.
Update2:
Zastępowanie konstruktora kopii i konstruktora przypisania najwyraźniej rozwiązać problem
Update3:
Właśnie wydany GUI klasa ta została przeznaczona na licencji MIT.
Czy ten C++ C++ 11 lub 03? – VermillionAzure
Powinieneś mieć jeden kontener z modelowaniem najbardziej ogólnych wymagań (to jest std :: vector do obsługi elementów GUI) i widoków do tego kontenera (std :: vector :: iterator) –
Z ciekawości mówisz "Dostęp do łańcucha jest wolny", co jest wolne i jak ważna jest jego prędkość? (Powiedziałeś, że nie jest często używany, ale czy jest używany w krytycznych momentach czasu?) Może to potencjalnie wpłynąć na proponowane rozwiązanie. –