Effective STL: 将vector和string的数据传给历史遗留的C风格API
2017-04-05 13:15
405 查看
如果有一个vector对象v,而你需要得到一个指向v中数据的指针,以使得它可以被当作一个数组,只要使用&v[0]就可以了。对于string对象s,相应的咒语是简单的s.c_str()。
注意:vector和string的数据最好只传给只读取而不修改它的API
如果你将v传给一个修改其元素的C风格API的话,典型情况都是没问题,但被调用的函数绝不能试图改变vector中元素的个数。
用C风格API返回的元素初始化STL容器
如果你想用C风格API返回的元素初始化一个vector,你可以利用vector和数组潜在的内存分布兼容性将存储vecotr的元素的空间传给API函数:
这个技巧只能工作于vector,因为只有vector承诺了与数组具有相同的潜在内存分布.不过灵活发挥一下,其他STL容器也是可以的。
vector和string以外的STL容器如何将它们的数据传给C风格API?
只要将容器的每个数据拷到vector,然后将它们传给API:
void doSomething(const int* pInts, size_t numInts); if (!v.empty()) // 如果v为空,&v[0]试图产生一个指向根本就不存在的东西的指针 { doSomething(&v[0], v.size()); } // 以上从vector上获取指向内部数据的指针的方法,对string不是可靠的,因为 // 1 string中的数据并没有保证被存储在独立的一块连续内存中 // 2 string的内部表示形式并没承诺以一个null字符结束 void doSomething(const char *pString); doSomething(s.c_str()); // 无需顾虑s为空的情况
注意:vector和string的数据最好只传给只读取而不修改它的API
如果你将v传给一个修改其元素的C风格API的话,典型情况都是没问题,但被调用的函数绝不能试图改变vector中元素的个数。
用C风格API返回的元素初始化STL容器
如果你想用C风格API返回的元素初始化一个vector,你可以利用vector和数组潜在的内存分布兼容性将存储vecotr的元素的空间传给API函数:
// C API:此函数需要一个指向数组的指针,数组最多有arraySize个double // 而且会对数组写入数据。它返回写入的double数,不会大于arraySize size_t fillArray(double *pArray, size_t arraySize); vector<double> vd(maxNumDoubles); // 建立一个vector,大小是maxNumDoubles vd.resize(fillArray(&vd[0], vd.size())); // 让fillArray把数据写入vd,然后调整vd的大小为fillArray写入的元素个数
这个技巧只能工作于vector,因为只有vector承诺了与数组具有相同的潜在内存分布.不过灵活发挥一下,其他STL容器也是可以的。
// C API:此函数需要一个指向数组的指针,数组最多有arraySize个char // 而且会对数组写入数据。它返回写入的char数,不会大于arraySize size_t fillString(char *pArray, size_t arraySize); vector<char> vc(maxNumChars); // 建立一个vector,大小是maxNumChars vd.resize(fillString(&vc[0], vc.size())); // 让fillString把数据写入vc,然后调整vd的大小为fillArray写入的元素个数 string str(vc.begin(), vc.end()); // 从vc通过范围构造函数拷贝数据到string deque<char> d(vd.begin(), vd.end()); // 拷贝数据到deque list<char> l(vd.begin(), vd.end()); // 拷贝数据到list set<char> s(vd.begin(), vd.end()); // 拷贝数据到set
vector和string以外的STL容器如何将它们的数据传给C风格API?
只要将容器的每个数据拷到vector,然后将它们传给API:
void doSomething(const int* pints, size_t numInts); // C API set<int> intSet; // 保存要传递给API数据的set ... vector<int> v(intSet.begin(), intSet.end()); // 拷贝set数据到vector if (!v.empty()) { doSomething(&v[0], v.size()); // 传递数据到API }
相关文章推荐
- Effective STL:Item 16:如何将vector和string的数据传给传统的API函数
- 条款16: 如何将vector和string的数据传给遗留的API
- 条款16: 如何将vector和string的数据传给遗留的API
- <Effective STL>笔记--vector和string
- 了解如何把vector和string数据传给旧的API
- 如何把vector和string数据传递给旧的api
- &lt;Effective STL&gt;笔记--vector和string
- 【S16】了解如何把vector和string数据传给旧的API
- STL----vector与string
- STL 基本容器 : string、vector、list、deque、set、map 的区别
- STL中: string、vector、list、deque、set、map 的区别
- gdb调试,查看stl容器信息,string,vector等
- STL中基本容器string,vector,list,deque,set,map之间的区别
- STL中map和string, vector 用法详解
- STL几个(set map vector string)用法
- STL中map和string, vector 用法详解
- STL中map和string, vector 用法详解
- STL基本容器: string、vector、list、deque、set、map
- 利用STL函数swap进行vector内的数据交换
- 你怎么就一根筋呢? STL之vector and string用还是不用