2009-08-28 17 views
28

Poprzednio używałem klas kolekcji MFC, takich jak CArray i CMap. Po pewnym czasie przełączyłem się na pojemniki STL i używam ich przez jakiś czas. Chociaż znajduję STL znacznie lepiej, nie jestem w stanie wskazać dokładnych przyczyn. Niektóre z uzasadnieniem takich jak:Dlaczego kontenery STL są preferowane w porównaniu z kontenerami MFC?

  1. Wymaga MFC: nie posiada, ponieważ inne części mojego programu korzysta MFC
  2. Jest to platforma zależne. Nie posiada, bo uruchomić mojej aplikacji tylko na oknach (Nie potrzebne do przenoszenia)
  3. to jest zdefiniowane w standardzie C++: OK, ale pojemniki MFC nadal pracować

jedynym powodem mogę wymyślić to, że można używać algorytmów na pojemnikach. Czy jest tu jakikolwiek inny powód, którego tu brakuje - co sprawia, że ​​kontenery STL są lepiej dostępne niż kontenery MFC?

+1

Możesz dodać do tytułu tego pytania, że ​​przenośność nie jest problemem. Sam tytuł nie odzwierciedla teraz niektórych Twoich wymagań. –

+0

STL jest zdecydowanie lepszy, jak wszystkie odpowiedzi na to pytanie, ale to, co naprawdę mnie drażni to to, że nadal jest pisanie ppl przy użyciu kontenerów MFC. Oczywiście, w większości używają one szablonów, ale przejście między nimi jest marnotrawstwem. Dlaczego stwardnienie rozsiane nie albo nie zdeprecjonują ich albo dodają iteratorów do nich właśnie oni siedzą na ogrodzeniu pissing od wszystkich innych. – Adrian

+0

@Adrian, ponieważ niektórzy z nas muszą używać starszego kodu, ale chcą najnowszych narzędzi. Zapewnienie wsparcia dla starych rzeczy, ale także zachęcanie do nowych rzeczy jest najlepsze z obu światów. Zaufaj mi, to by mnie bardziej zaskoczyło, gdyby MS usunęło stare pojemniki. Zastanów się, że jeśli używasz MFC, prawdopodobnie masz do czynienia ze "starszą" aplikacją. :-D – franji1

Odpowiedz

44

Ronald Laeremans VC++ kierownika jednostki produktu, nawet said to use STL w czerwcu 2006 roku:

I szczerze zespół daje tę samą odpowiedź. Klasy kolekcji MFC są dostępne tylko w celu zapewnienia kompatybilności wstecznej. C++ ma standard dla klas kolekcji i jest to biblioteka standardów C++. Nie ma technicznych wad w używaniu dowolnej standardowej biblioteki w aplikacji MFC.

Nie planujemy wprowadzania istotnych zmian w tym obszarze.

Ronald Laeremans
Działając jednostkę produktu Menedżer
Visual C++ zespołu

Jednak w pewnym momencie w którym się pracuje na jakimś kodem, który biegł na etapie instalacji systemu Windows, nie wolno było używać pojemników STL , ale powiedziano mi, żeby zamiast tego używał kontenerów ATL (a właściwie w rzeczywistości CString, który, jak sądzę, nie jest w rzeczywistości pojemnikiem). Wyjaśnienie było takie, że kontenery STL miały zależności od bitów środowiska wykonawczego, które mogą nie być faktycznie dostępne w czasie, w którym kod musiał zostać wykonany, podczas gdy te problemy nie istniały dla kolekcji ATL. Jest to raczej specjalny scenariusz, który nie powinien wpływać na 99% kodu tam.

+7

'CString' nie jest tak naprawdę kontenerem (z wyjątkiem bardzo technicznego punktu widzenia) i ma wiele funkcji ułatwiających korzystanie, które sprawiają, że jest on dużo bardziej przydatny w obsłudze interfejsów API Win32 i COM. –

+3

* "Wyjaśnienie było takie, że kontenery STL były zależne od bitów środowiska wykonawczego, które mogą nie być faktycznie dostępne w momencie, w którym kod musiał wykonać" * ... Teraz chciałbym zobaczyć * tę * część * kontenera * kod w STL. To prawda, nie jestem pewien z tymi wszystkimi opcjami debugowania, które są opcjonalnie dostępne, ale dla wersji z czystym wydaniem powiedziałbym, że wszystkie kolekcje STL są czystymi bitami bez nagłówków. (Szybkie sprawdzenie C++ STDLIB MSVCP * .DLL nie spowodowało żadnego eksportu związanego z kontenerem.) –

+0

@MartinBa: Spekulowałbym, że jest subtelny: prawdopodobnie w szczegółach jak 'std :: allocator :: allocate' jest zaimplementowane, klasy wyjątków i podobne. –

1

Jest to przypadek, w którym narzędzia działają w odniesieniu do pracy, którą chce się wykonać, a "lepiej" jest terminem subiektywnym.

Jeśli potrzebujesz używać kontenerów z innym zgodnym z normami kodem, lub jeśli kiedykolwiek będzie to kod współużytkowany na różnych platformach, kontenery STL są prawdopodobnie lepszym rozwiązaniem.

Jeśli masz pewność, że Twój kod pozostanie w MFC-land, a pojemniki MFC będą działać dla Ciebie, dlaczego nie będziesz ich nadal używać?

Kontenery STL nie są z natury lepsze niż kontenery MFC, jednak ponieważ są częścią standardu, są bardziej przydatne w szerszym zakresie kontekstów.

+2

Nie raz w moim nosicielu słyszałem "to nigdy nie zostanie przeniesione" i zobaczyłem, że to stwierdzenie staje się fatalnie złe. – sbi

33

kontenery STL:

  • Czy wydajność gwarantuje
  • Może być stosowany w algorytmach STL które również mają gwarancje wykonania
  • można wykorzystać przez stronę trzecią C++ bibliotek, takich jak Boost,
  • Are standardowe i prawdopodobnie przeżyją zastrzeżone rozwiązania.
  • Zachęcaj do generycznego programowania algorytmów i struktur danych. Jeśli napiszesz nowe algorytmy i struktury danych zgodne ze STL, możesz wykorzystać to, co STL zapewnia już bez żadnych kosztów.
21
  • kompatybilności z innymi bibliotek (jak impuls) w składni współdziałaniem i paradygmatu. To niebanalna korzyść.
  • Użycie STL rozwinie zestaw umiejętności, który będzie bardziej przydatny w innych kontekstach. MFC nie jest już tak szeroko stosowane; STL to.
  • Użycie STL rozwinie nastawienie, które może (lub nie musi) okazać się przydatne w kodzie, który sam napiszesz.

Używanie czegoś innego niż STL nie jest jednak z natury złe.

2

Myślę, że sprowadza się to do prostego pytania: komu bardziej ufasz? Jeśli masz zaufanie do firmy Microsoft, kontynuuj korzystanie z wariantów MFC. Jeśli ufasz branży, użyj STL.

Głosuję za STL, ponieważ kod działający w systemie Windows może być jutro przeniesiony na inną platformę. :)

+1

Ważny punkt ogólnie, ale nie w tym konkretnym przypadku: i tak używa on MFC w każdym miejscu, a zastąpienie kontenerów MFC przez STL w niewielkim stopniu przyczyniłoby się do przenoszenia jego aplikacji. –

+5

Microsoft jest odpowiedzialny zarówno za MFC, jak i STL w ich własnym kompilatorze, więc nie jest to argumentem. Nigdy nie stwierdziłem, że wiarygodność tych dwóch paradygmatów jest różna. –

+0

Dobra uwaga. Zawsze możesz jednak użyć biblioteki innej firmy. –

5

Zawsze wolę używać więcej standardowych/kompatybilnych bibliotek, ponieważ mogę mieć przyszłe projekty, w których mogę ponownie wykorzystać część kodu. Nie mam pojęcia, z jakich bibliotek będą korzystać przyszłe projekty, ale mam większe szanse na ponowne wykorzystanie kodu, jeśli używam standardowych/kompatybilnych rzeczy.

Im więcej korzystam z biblioteki, tym szybciej i wygodniej. Jeśli mam poświęcić czas na naukę biblioteki, chcę się upewnić, że pozostanie ona w pobliżu i nie jest powiązana z konkretną platformą lub strukturą.

Oczywiście, mówię o tym wszystkim, zakładając, że moje wybory są dość podobne, jeśli chodzi o wydajność, funkcje i łatwość użytkowania. Na przykład, jeśli klasy MFC są wystarczająco znaczącą poprawą w tych obszarach, użyłbym ich zamiast tego.

6
  • STL ma więcej rodzajów zbierania niż MFC
  • Visual Studio (2008+) debugger wizualizuje STL znacznie lepiej niż MFC. (AUTOEXP.DAT magia może naprawić - ale jest to ból Nic podobnego debugowania debugger kiedy przykręcić ...)

Jedna dobra rzecz z MFC jest to, że nadal istnieje duży korpus Kod MFC tam. Inne odpowiedzi mówią o kompatybilności z innymi firmami. Nie zapomnij o materiałach innych firm opartych na MFC.

+1

Tak, uwielbiam debuger VS2008, jeśli chodzi o STL. Poprzednio używałem VC6, a transformacja do VS2008 znacznie ułatwiła mi życie. – Naveen

+1

Niedawno opublikowałem dodatek do pliku autoexp.dat, który zapewnia właśnie to: http://thetweaker.wordpress.com/2010/01/11/visualizing-mfc-containers-in-autoexp-dat/ –

3

Kontenery MFC pochodzą z CObject i CObject, ponieważ operator przypisania jest prywatny. Znalazłem to bardzo denerwujące w praktyce.

std::vector, unlinke CArray gwarantuje, że blok pamięci jest ciągłe, więc można współdziałanie z interfejsów programowania C prościej:

std::vector<char> buffer; 
char* c_buffer = &*buffer.begin(); 
+0

CArray gwarantuje ciągłą pamięć : "Pamięć jest przydzielana w sposób ciągły do ​​górnej granicy, nawet jeśli niektóre elementy mają wartość zerową". http://msdn.microsoft.com/en-us/library/4h2f09ct.aspx –

1

Ponieważ biblioteka, która wykorzystuje iteratory łączenie sekwencji jakiegokolwiek rodzaju z algorytmami tak, że A) wszystkie sensowne permutacje są możliwe, a B) uniwersalne, to (kiedy myślisz o swojej koncepcji biblioteki kontenerów, tak jak było 15 lat temu), taki niesamowicie zadziwiający pomysł, że został prawie całkowicie zdominowany wody wszystko inne w ciągu mniej niż dziesięciu lat?

Poważnie, STL ma swoje wady (dlaczego nie ma zakresów zamiast iteratorów?) I że idiom typu "usuń-usuń" nie jest całkiem ładny, ale jest oparty na genialnym pomyśle i istnieją bardzo dobre powody, dla których nie musimy się uczyć nowa biblioteka kontenerów/algorytmów za każdym razem, gdy rozpoczynamy nową pracę.

1

Oprócz wspomnianych aspektów: dobrze obsługiwany, dostępny w standardzie, zoptymalizowany pod kątem wydajności, przeznaczony do użycia z algorytmami, mogę dodać jeszcze jeden aspekt: ​​bezpieczeństwo typu i mnóstwo kontroli podczas kompilacji. Nie możesz sobie nawet wyobrazić, jak wyciągnąć double z .

1

Nie odrzucałbym całkowicie argumentu przenośności. Tylko dlatego, że używasz MFC dzisiaj, nie oznacza, że ​​zawsze będziesz. I nawet jeśli piszesz głównie dla MFC, niektóre z twoich kodów mogą być ponownie wykorzystane w innych aplikacjach, jeśli są bardziej ogólne i oparte na standardach.

Myślę, że innym powodem do rozważenia STL jest to, że jego konstrukcja i ewolucja skorzystała z bibliotek, które miały wcześniej, obejmują MFC i ATL. Tak wiele rozwiązań jest czystszych, bardziej użytecznych i mniej podatnych na błędy. (Chociaż wolałbym, żeby mieli lepszą konwencję nazewnictwa.)

3

Zakłada się obecnie, że twórcy C++ są co najmniej przelotnie zaznajomieni ze STL. Nie dotyczy to kontenerów MFC. Jeśli więc dodasz nowego programistę do swojego zespołu, łatwiej będzie Ci znaleźć takiego, który zna STL niż kontenery MFC, dzięki czemu będzie mógł wnieść swój wkład natychmiast.

Powiązane problemy