Вектор структур с динамически размещаемыми элементами - PullRequest
1 голос
/ 14 ноября 2011

Если бы я хотел заполнить вектор структурой, а в структуре мне нужно динамически распределить / переместить массивы WCHAR, как бы я заполнил это?
Я не могу использовать std::wstring, потому что я собираюсь использовать участников с Windows API. А функции типа RegQueryValueEx требуют LPBYTE для получения данных.

Или есть какой-то другой контейнер STL, который я должен использовать?

Пример кода:

typedef struct {
    WCHAR *str1;
    WCHAR *str2;
    DWORD SomeOtherStuff;
} MYSTRUCT;

vector<MYSTRUCT> myvector;

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Используйте std::vector<WCHAR> для элементов структуры. Это даст вашей структуре необходимую семантику копирования / перемещения, чтобы поместить ее в vector, и, когда вам нужен необработанный указатель для некоторого API, он доступен как &str1[0].

Не забудьте убедиться, что он достаточно большой (либо инициализировав его до требуемого размера, либо вызвав resize()), прежде чем делать что-либо, что получит доступ к данным. Также помните, что указатели и итераторы данных станут недействительными при изменении размера вектора.

0 голосов
/ 14 ноября 2011

Вы можете определить конструктор копирования, оператор присваивания и деструктор для вашей структуры.И тогда все копии, сделанные из каждого экземпляра, будут иметь свою собственную копию динамически выделяемой памяти.

Или вы можете просто использовать std::wstring

std::wstring, предоставляющий метод доступа c_str, который дает вам указатель на базовую строку с нулевым символом в конце.Это позволяет использовать std :: wstring с API-интерфейсами C.

std::wstring wide_string;
some_win_api_call( wide_string.c_str() );  // sending a string to winapi

Чтобы получить строку из winapi, вам нужно самостоятельно выделить буфер и передать указатель на буфер вместе с длинойбуфера.

wide_string.reserve( 256 );  // allocate some space to receive a string
get_string_from_winapi( &wide_string[0], wide_string.capacity() );

Возможно, вам придется сделать wide_string.capacity() * sizeof(wchar_t), если API хочет длину в байтах.Мой пример предполагает длину в символах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...