Pracuję z wieloma kodami obliczeniowymi napisanymi w C ++ z myślą o wysokiej wydajności i niskim zużyciu pamięci. Używa (głównie vector
) kontenerów STL i iteruje je prawie w każdej funkcji.
Kod iteracyjny wygląda następująco:
for (int i = 0; i < things.size(); ++i)
{
// ...
}
ale generuje ostrzeżenie o niezgodności podpisanej / niepodpisanej (C4018 w programie Visual Studio).
Zastąpienie int
jakimś unsigned
typem jest problemem, ponieważ często używamy pragm OpenMP i wymaga to, aby licznik był int
.
Mam zamiar stłumić (setki) ostrzeżeń, ale obawiam się, że przegapiłem jakieś eleganckie rozwiązanie problemu.
Na iteratorach . Myślę, że iteratory są świetne, gdy są stosowane w odpowiednich miejscach. Kod, z którym pracuję, nigdy nie zmieni kontenerów o dostępie swobodnym na list
lub coś (więc iteracja z użyciem int i
jest już agnostyczna) i zawsze będzie potrzebować bieżącego indeksu. A cały dodatkowy kod, który trzeba wpisać (sam iterator i indeks) tylko komplikuje sprawę i zaciemnia prostotę kodu bazowego.
int
.