2016-06-25 6 views
1

Ich bevorzuge size_t, um mit Vektorindex umzugehen. Aber wenn Index verschoben wird, ist es sicher? Zum BeispielIst es sicher, size_t zu verwenden, um den Vektorindex zu verschieben?

size_t n = 10000000; 
vector<int> v(n); 

size_t i = 500000; 
size_t shift = 20000; 
int a = v(i - (-1) * shift); // Is this ok? what is `(-1) * shift` type, size_t? 
int b = v(-shift + i); // Is this ok? what is `-shift` type, size_t? 
+0

'Vektor ' Indizes sind 'Vektor :: size_type' in Typ, der ist * in der Regel *' size_t', aber Sie * sollten * 'size_type' anstelle von' size_t' direkt verwenden. –

+0

@RemyLebeau Ist das gleich wie size_t? – user1899020

+0

'size_type' ist definiert als:" size_type kann jeden nicht negativen Wert von difference_type darstellen ". Und "difference_type" ist: "identisch mit dem Unterschiedstyp von X :: iterator und X :: const_iterator". Das heißt, dass es sich um einen Typ handelt, der den Unterschied zwischen zwei beliebigen Adressen im Vektor darstellen kann. 'size_t' muss per Definition diese Anforderung erfüllen. –

Antwort

1

a size_t mit (-1) sicher Multipliziert, wickelt sie um den Maximalwert von size_t als size_t ein unsigned Typ ist. So ist (-1) * shift das gleiche wie std::numeric_limits<size_t>::max-shift+1.

2

Die Negierung einer unsigned Menge ist eine gültige Operation. Abschnitt 5.3.2 von C++ 11:

Die negativen einer unsigned Menge durch Subtrahieren seines Wertes von 2^n berechnet wird, wobei n die Anzahl der Bits in dem geförderten Operanden ist. Der Typ des Ergebnisses ist der Typ des beworbenen Operanden.

Also, das ist "sicher", insofern dies definiertes Verhalten ist.

0

Sicher meinst du v[...] statt v(); std::vector hat keine operator(int).

Wie dem auch sei, empirisch,

#include <iostream> 
using namespace std; 
int main(){ 
    unsigned foo = 1; 
    cout<<(-1)*foo<<'\n'; 
    cout<<-foo<<'\n'; 
    cout<<foo*(-1)<<'\n'; 
    cout<<static_cast<int>(-foo)<<'\n'; 
    cout<<static_cast<int>(foo)*-1<<'\n'; 
} 

ergibt:

4294967295 
4294967295 
4294967295 
-1 
-1 

ergo eine negierte unsigned oder ohne Vorzeichen mit -1 überläuft, multipliziert mit um seinen Maximalwert Einwickeln (dies sollte das theoretische Verhalten sein zu).

Als size_t zu http://en.cppreference.com/w/cpp/container/vector/operator_at, wenn zufällig std::vector<T>::size_type nicht size_t ist (unwahrscheinlich, aber möglich), size() sollte sicher führen innerhalb der Grenzen des Vektors ein size_t vorbei und nicht zu UB für die Weitergabe, wie size_t groß sein muss, genug, um ein Array beliebiger Größe zu indexieren.

Verwandte Themen