|
|
|
Какой контейнер посоветуете?
|
|||
|---|---|---|---|
|
#18+
Имеется VCL TMemoryStream с данными. Необходимо получить STL контейнер с итераторами и передать туда содержимое стрима VCL. Создавать вектор и побайтно заполнять его, думаю накладно. Существуют ли контейнеры куда можно передать начало и конец области памяти без копирования побайтно? Дмитрий. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2006, 15:44 |
|
||
|
Какой контейнер посоветуете?
|
|||
|---|---|---|---|
|
#18+
Не знаю, что такое TMemoryStream, но любой контейнер, поддерживающий assign подойдёт. int a[1000]; for(int i=0; i< 1000; i==) a = i; vector<int> v; v.assign(a,a+1000); разумеется при условии, что копируемый объект лежит в памяти непрерывно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2006, 17:34 |
|
||
|
Какой контейнер посоветуете?
|
|||
|---|---|---|---|
|
#18+
А зачем вам контейнер - судя по описанию задачи нужен поток... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2006, 17:56 |
|
||
|
Какой контейнер посоветуете?
|
|||
|---|---|---|---|
|
#18+
поток + потоковый итератор. Все это есть в STL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2006, 17:57 |
|
||
|
Какой контейнер посоветуете?
|
|||
|---|---|---|---|
|
#18+
nikname, >int a[1000]; >for(int i=0; i< 1000; i==) >a = i; >vector<int> v; >v.assign(a,a+1000); >разумеется при условии, что копируемый объект лежит в памяти непрерывно. ПАСИБОЧКИ большое! в доке метод assign описан как принимающий два итератора, однако в моем случае сработала передача обыкновенных указателей на память. Странно. Я не уверен что это правило работает для всех случаев в STL. Вот код методя, который я мучаю для приспосбливания к Base64 перекодированию под BCB Если кто может - можно ли сократить данный метод? #inclide base64.h void __fastcall BinStreamToStringBase64(TMemoryStream *p_Stream, AnsiString &p_String) { base64<char> encoder; int _State = 0; std::vector<char> a_Vector; a_Vector.assign(reinterpret_cast<char *>(p_Stream->Memory), reinterpret_cast<char *>(p_Stream->Memory) + p_Stream->Size); std::stringstream out; ostreambuf_iterator<char> _Out = out.rdbuf(); std::vector<char>::iterator _From = a_Vector.begin(); std::vector<char>::iterator _To = a_Vector.end(); encoder.put(_From, _To, _Out, _State, base64<>::crlf()); p_String = out.str().c_str(); } Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2006, 21:02 |
|
||
|
Какой контейнер посоветуете?
|
|||
|---|---|---|---|
|
#18+
Попробуйте Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Дело в том, что для vector<_Type> однонаправленный итератор вполне эквивалентен _Type *. И, похоже, encoder.put требует однонаправленные итераторы, только для прохода от From к To. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2006, 22:22 |
|
||
|
Какой контейнер посоветуете?
|
|||
|---|---|---|---|
|
#18+
nikname, >Дело в том, что для vector<_Type> однонаправленный итератор вполне эквивалентен _Type *. >И, похоже, encoder.put требует однонаправленные итераторы, только для прохода от From к To. Ваше предположение подтвердилось. Инкодеру хватило прямых указателей на память. Инкодер: http://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4095/ Вот что в итоге получилось: void __fastcall BinStreamToStringBase64(TMemoryStream *p_Stream, String &p_String) { base64<char> encoder; int _Status; std::stringstream out; ostreambuf_iterator<char> _Out = out.rdbuf(); encoder.put(reinterpret_cast<char *>(p_Stream->Memory), reinterpret_cast<char *>(p_Stream->Memory) + p_Stream->Size, _Out, _Status, base64<>::crlf()); p_String = out.str().c_str(); } //-------------------------------------------------------------------------- -- void __fastcall StringBase64ToBinStream(String &p_String, TMemoryStream *p_Stream) { base64<char> encoder; int _Status; std::stringstream out; ostreambuf_iterator<char> _Out = out.rdbuf(); encoder.get(p_String.c_str(), p_String.c_str() + p_String.Length(), _Out, _Status); p_Stream->Write(out.str().c_str(), out.str().size()); } тепрерь картинки летают по сети в виде VARIANT vIn; vIn.vt = VT_BSTR; Дмитрий Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2006, 15:28 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33508945&tid=2032051]: |
0ms |
get settings: |
9ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
172ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 536ms |

| 0 / 0 |
