В любой момент времени, std::vector<>
имеет ограничение, size
которое максимальное количество элементов вы можете получить доступ к + 1, а также ограничению capacity
которое, сколько элементов он может содержать, прежде чем он должен переместить данные на больший выделение памяти.
size
определяет, к чему вы можете получить доступ. Когда вектор создан, вы ничего не можете получить. vec[0]
является незаконным, когда вектор пуст.
#include <vector>
#include <iostream>
int main()
{
std::vector<int> vec;
std::cout << "initially, vec.size = " << vec.size() << ", cap = " << vec.capacity() << "\n";
// initially, the vector is empty.
// std::cout << vec[0] << '\n'; // undefined behavior, probably a crash
// you can only ever access vec[n] where v < vec.size(),
// this vector is empty, so size() == 0
// Lets add a number to the vector.
vec.push_back(5);
std::cout << "now, vec.size = " << vec.size() << ", cap = " << vec.capacity()
std::cout << "vec[0] = " << vec[0] << '\n';
// std::cout << vec[1] << '\n'; // undefined behavior because 1 >= size()
vec.resize(5);
std::cout << "resized, vec.size = " << vec.size() << ", cap = " << vec.capacity()
vec[1] = 1; // valid, resize made space for vec[0] .. vec[4]
vec[2] = 2;
for (auto it = vec.begin(), end = vec.end(); it != end; ++it)
std::cout << *it << '\n';
return 0;
}
push_back
делает "vec.resize (vec.size() + 1)" для вас, а затем вставляет значение будучи «push_back'ed в новый слот.
resize
пытается освободить место для дополнительных элементов - если размер 3 и вы говорите resize(5)
, он попытается освободить место для 2 новых элементов.
Если результат приводит к тому, что size
превышает capacity
, тогда вектор выделяет новый массив, копирует в него старые данные и освобождает старый массив. Это может стать очень дорогостоящим. Если вы знаете как велик ваш вектор собирается стать, вы можете избежать этого перемещения по телефону reserve()
#include <iostream>
#include <vector>
using std::cout;
struct Stud // will always tell you when it reproduces
{
int m_i;
Stud() : m_i(-1) {}
Stud(int i) : m_i(i) {}
Stud(const Stud& rhs) : m_i(rhs.m_i) { cout << "Copying(Ctor) " << m_i << '\n'; }
Stud& operator=(const Stud& rhs) { m_i = rhs.m_i; cout << "Copying(=) " << m_i << '\n'; return *this; }
};
int main()
{
std::vector<Stud> studs;
studs.push_back(0);
studs.push_back(1);
studs.reserve(5);
studs.push_back(5); // remember, this adds to the back.
studs.push_back(6);
std::cout << "size of studs " << studs.size();
return 0;
}
На основе этого
bool Update_V4(USHORT S1,USHORT S2,DWORD S3,USHORT S4);
Я предполагаю, что вы пытаетесь имитировать многомерный массивы какой-то, и вы делаете что-то вроде
V4Ref[S1]
без проверки
if (S1 < V4Ref.size())
C++ имеет функцию 'assert', которая приведет к завершению приложения Debug build, если условие не выполнено.
#include <cassert>
#include <vector>
int main()
{
std::vector<int> vec;
assert(vec.size() == 0);
vec.push_back(1);
vec.resize(5);
vec.push_back(5);
assert(vec.size() == 10); // expect to crash here.
return 0;
}
Вы можете использовать это, чтобы помочь поймать плохих размеров:
bool V4::Update_V4(USHORT S1,USHORT S2,DWORD S3,USHORT S4)
{
assert(S1 < V4ref.size());
return V4ref[S1].Update_V3(S2, S3, S4);
}
Мы не можем знать, что вы там делаете ... Вы сказали 'Я попытался с помощью вектора V5ref [2]', но там нет 'V5ref' vector. Также вы должны написать больше своего кода, а не только заголовочный файл. – Victor
Note * больше * код, но * соответствующий * код. – juanchopanza