Wielkość listy - size() - liniowo?!

0

Cześć, na Wikipedii odnośnie listy w C++ można przeczytać, że metoda size()

zwraca obecną ilość elementów listy (działa w czasie liniowym)
. Czy to prawda?! - chodzi mi o tą część w nawiasie tzn. że ta funkcja działa w czasie liniowym tzn. że lista mająca 1000 elementów zwróci informację o wielkości 100 razy wolniej niż lista mająca 10 elementów?!?
Pytam, bo z tego wynika, że lista, by zwrócić swoją wielkość musi w takim razie przejść przez wszystkie swoje elementy. Ale czy nie może być przechowywana sama ilość listy w tej klasie a przy każdym dodaniu nowego obiektu ta wartość być inkrementowana - a w przypadku użycia metody size() zwracana tylko ta zmienna, bez konieczności przechodzenia przez wszystkie elementy?!
A może Wiki się myli?!

2

Zalezy od implementacji.

W C++11 std::size() dziala w O(1).

  • Nie uzywaj niczego innego niz std::vector, chyba ze profiler krzyczy inaczej.
0

Dzięki @n0name_l za rozwianie moich wątpliwości.

n0name_l napisał(a):
  • Nie uzywaj niczego innego niz std::vector, chyba ze profiler krzyczy inaczej.

Czym jest profiler? Dlaczego mam używać vectora? Tak źle jest z listą w porównaniu do vectora?

0

Właśnie sprawdziłem pod VS2008 (czyli sprzed C++11 na pewno...)

	size_type size() const
		{	// return length of sequence
		return (_Mysize);
		}

Jak widać, nie ma żadnej iteracji.

0

#http://en.wikipedia.org/wiki/Profiling_(computer_programming)
#Zazwyczaj nie potrzeba niczego innego. std::vector jest "domyslna" (jakkolwiek to brzmi) struktura danych w C++ i dopoki cos wyraznie nie mowi, zeby uzyc czegos innego, to sie nie uzywa. Do tego jest calkiem wydajny (tj. random-access w O(1), pamiec ciagla).

1

Tak źle jest z listą w porównaniu do vectora?
Zazwyczaj kiedy myśli się, że lista będzie w danym przypadku szybsza od vectora, to tak jednak nie jest.

0

w Linuxie w stl_list.h :

      /**  Returns the number of elements in the %list.  */
      size_type
      size() const _GLIBCXX_NOEXCEPT
      { return std::distance(begin(), end()); }

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49561

1 użytkowników online, w tym zalogowanych: 0, gości: 1