Из того, что я читал, std::vector
- это подходящая структура для взаимодействия с c-функцией, требующей массива массива смежных массивов. Однако мне было интересно, как я могу определить размер массива в некоторых случаях.Правильный способ установки размера std :: vector
Я написал небольшую пробную программу, чтобы проиллюстрировать, что я имею в виду.
int main(int argc, char *argv[])
{
std::vector<unsigned char>v;
unsigned char p[1024];
sprintf((char*)&p[0], "%10d", 10);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(30);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
memcpy(&v[0], &p[0], 20);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(50);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(0);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.resize(20);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.resize(0);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
return 0;
}
Выход (не очень удивительно):
Size: 0 Length: 0
Size: 0 Length: 30
Size: 0 Length: 30
Size: 0 Length: 50
Size: 0 Length: 50
Size: 20 Length: 50
Size: 0 Length: 50
Причина, почему я сделал это, потому что я оставляю за собой буфер определенного размера, а затем передать эту память в гнездо через recv()
, Поскольку я должен передать память как указатель, нет никакого способа, чтобы размер вектора корректировался в соответствии с тем, что возвращает recv
. Теперь, когда полученное количество байтов меньше, чем буфер, я бы подумал, что могу как-то отрегулировать размер вектора, поэтому, когда я его передаю, вызывающий может сделать v.size()
, а количество элементов, возвращаемых Получать.
Когда я посмотрел данные из приведенного выше примера, при использовании resize()
размер буфера отрегулирован правильно, но данные ушли. Так что мне действительно нужно копировать память по отдельности в новый вектор, чтобы получить правильный размер? Это звучит как действительно ненужные накладные расходы для меня. Или есть способ сообщить вектору, сколько элементов в настоящее время предполагается удерживать?
Спасибо, это был действительно правильный ответ, и я проверил его с помощью моей тестовой программы в отладчике. Теперь я также понимаю, почему. :) Это также соответствует моей модели реализации, поскольку я не использую конструктор в начале, но хочу установить размер вручную. – Devolus