[TL][c++]能对vector<unsigned char>取地址做unsigned char*用吗?

307 views
Skip to first unread message

jinhu wang

unread,
Nov 23, 2009, 12:05:47 AM11/23/09
to TopLanguage
我用vector<unsigned char>m_vContainer作为容器存信息。
我想把它传出去的时候,函数参数类型是个指针类型+size;
我能通过char*p = &(m_vContainer[0]);这种方式取数据吗

alai

unread,
Nov 23, 2009, 12:17:34 AM11/23/09
to pon...@googlegroups.com
对于已知的绝大多数STL实现中的vector,是可以的,直接用迭代器也行,m_vContainer.begin(),vector的迭代器其实就是指针,不过要注意它的有效性,在某些操作之后(插入或删除元素),迭代器和指针就会失效。

2009/11/23 jinhu wang <wangji...@gmail.com>

wang feng

unread,
Nov 23, 2009, 12:24:05 AM11/23/09
to pon...@googlegroups.com
unsigned char*p = m_vContainer.begin();就可以了

K.L.

unread,
Nov 23, 2009, 6:12:01 AM11/23/09
to TopLanguage
一般不行,vc8的iterator就不是raw pointer,最好是&(v.front()),而且要保证vector不为空。

K.L.

unread,
Nov 23, 2009, 6:13:14 AM11/23/09
to TopLanguage
看错了,以为你要对vector直接取地址

On 11月23日, 下午1时05分, jinhu wang <wangjinhu...@gmail.com> wrote:

孙照林

unread,
Nov 23, 2009, 12:17:37 AM11/23/09
to pon...@googlegroups.com
最好别这样,直接把索引传出去吧。否则vector的一些操作如push等会造成指针失效,会引发错误。

complex_ok

unread,
Nov 23, 2009, 12:36:26 AM11/23/09
to TopLanguage
std::vector<char> v;
char* p = &v[0];
这种用法是可以的,并合标准。

但是 char* p = v.begin();
这种用法就不要使用了。这用法隐含了一个假设,v的迭代器就是指针。这假设有时侯是不成立的,比如有些安全版本的stl实现。v的迭代器真的是一个
类。

char* p = &v[0];用法有实际意义。
比如,很多时候,我们需要分配内存。
以前我会直接写成
char* p = new char[size];
一些代码,
delete [] p;

现在我会写成
std::vector<char> buf;
buf.resize(size);
char* p = &buf[0];

之后使用就不用delete了,这样可以防止函数长时忘记释放。并且也是异常安全的。

On 11月23日, 下午1时05分, jinhu wang <wangjinhu...@gmail.com> wrote:

raymond

unread,
Nov 23, 2009, 9:23:22 AM11/23/09
to TopLanguage
在二进制写数据的时候这种方法也很有意义。

Fei Yan

unread,
Nov 23, 2009, 8:15:07 PM11/23/09
to pon...@googlegroups.com
二进制数据交换的时候,vector应用于没有实现C99变长数组的场景,确实非常有意义。

2009/11/23 raymond <shiq...@gmail.com>

Ian Yang

unread,
Nov 23, 2009, 9:19:41 PM11/23/09
to pon...@googlegroups.com
从迭代器取应该是 &(*it)

2009/11/23 wang feng <wanng...@gmail.com>



--
Sincerely, Ian Yang


Sent from Shanghai, 31, China

xpol

unread,
Dec 9, 2009, 9:51:13 AM12/9/09
to TopLanguage

On Nov 23, 1:05 pm, jinhu wang <wangjinhu...@gmail.com> wrote:
> 我能通过char*p = &(m_vContainer[0]);这种方式取数据吗

我一般都这样用。不过这样其实不好,因为这样我假设了stl的vector实现。

C++09

unread,
Dec 9, 2009, 12:15:11 PM12/9/09
to pon...@googlegroups.com
以前见过这个讨论。
对vector取地址需要防止vector因大小改变而使指针地址失效,
但对deque取地址则不怕。

jinhu wang

unread,
Dec 9, 2009, 9:06:54 PM12/9/09
to pon...@googlegroups.com
deque地址是连续的么?

2009/12/10 C++09 <cplus...@gmail.com>

liuxinyu

unread,
Dec 9, 2009, 9:46:17 PM12/9/09
to TopLanguage
complex_ok说的很清楚了。
我补充一下,大家可以参考Effective STL的第16条:
Item 16. Know how to pass vector and string data to legacy APIs.
这个条目的前一部分,就是这个例子。

OxFAN

unread,
Dec 9, 2009, 9:14:35 PM12/9/09
to pon...@googlegroups.com
显然不会是连续的,否则push_front()的效率会很差...

2009/12/10 jinhu wang <wangji...@gmail.com>

Siliang Wang

unread,
Dec 9, 2009, 11:50:41 PM12/9/09
to pon...@googlegroups.com
一般实现是分段连续的,关键是deque不会由于插入删除元素导致reallocate

2009/12/10 jinhu wang <wangji...@gmail.com>
Reply all
Reply to author
Forward
0 new messages