Я должен хранить целочисленные значения, которые отображаются на другие целые числа.Один из способов сделать это - использовать std :: map m.Но тогда для получения значения, используя m [int] или m.find (int), будет порядок logN (N - количество элементов) времени.В моем случае N довольно большое (до 2 ^ 30).Я думал, что использование std :: vector будет быстрее для доступа, поскольку каждый ключ теперь отображается на индекс элемента вектора, к которому можно получить доступ за O (1).Ключ встречается в случайном порядке, и они не могут быть смежными.Например, если вектор имеет размер 10, то не все 10 элементов являются допустимыми, и может быть только 6 допустимых элементов, а остальные мне нужно заполнить -1.Я написал небольшую программу и с удивлением обнаружил вывод ниже:
int main () {
std::vector<int> v;
v.assign(6, -1);
v[3] = 10;
v[10] = 100;
cout << v.size() << v.capacity() << endl ;
cout << v[3] << v[10] << endl;
}
Вывод: size = 6, емкость = 6, V [3] = 10, v [10] = 100.Я не понимаю, как размер и емкость равны 6, но v [10] имеет допустимое значение, или я не встретил сегмента.неисправность.Может кто-нибудь объяснить это?Насколько я понимаю, функция push_back динамически изменяет размер вектора, когда vector.size> vector.capacity, оператор [] также делает это?Чтобы быть в безопасности, я переписал приведенный выше код следующим образом:
int main () {
std::vector<int> v;
v.assign(6, -1);
int key = getKey();
if (key < v.size())
v[key] = <correct value>;
else {
v.resize(key, -1); // I want to assign -1 to invalid elements
v[key-1] = <correct value>;
}
}
Кажется, он работает нормально, но будет ли лучше сравнить ключ с v.capacity (), а затем изменить размер вектора.