设为首页 加入收藏

TOP

Effective STL: 将vector和string的数据传给历史遗留的C风格API
2015-07-20 17:41:01 来源: 作者: 【 】 浏览:2
Tags:Effective STL: vector string 数据 传给 历史 遗留 风格 API

如果有一个vector对象v,而你需要得到一个指向v中数据的指针,以使得它可以被当作一个数组,只要使用&v[0]就可以了。对于string对象s,相应的咒语是简单的s.c_str()。

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
   
     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
    
    vc(maxNumChars); 
    // 建立一个vector,大小是maxNumChars vd.resize(fillString(&vc[0], vc.size())); 
    // 让fillString把数据写入vc,然后调整vd的大小为fillArray写入的元素个数 string str(vc.begin(), vc.end()); 
    // 从vc通过范围构造函数拷贝数据到stringdeque
    
      d(vd.begin(), vd.end()); 
     // 拷贝数据到dequelist
     
       l(vd.begin(), vd.end()); 
      // 拷贝数据到listset
      
        s(vd.begin(), vd.end()); 
       // 拷贝数据到set
      
     
    
   

vector和string以外的STL容器如何将它们的数据传给C风格API?

只要将容器的每个数据拷到vector,然后将它们传给API:

void doSomething(const int* pints, size_t numInts); // C APIset
   
     intSet; 
    // 保存要传递给API数据的set ... vector
    
      v(intSet.begin(), intSet.end()); 
     // 拷贝set数据到vectorif (!v.empty()) { doSomething(&v[0], v.size()); 
     // 传递数据到API } 
    
   

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 1042-N!(大数类) 下一篇HDU3564Another LIS(线段树,LIS..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·用 C 语言或者限制使 (2025-12-25 08:50:05)
·C++构造shared_ptr为 (2025-12-25 08:50:01)
·既然引用计数在做 GC (2025-12-25 08:49:59)
·Java 编程和 c 语言 (2025-12-25 08:19:48)
·. net内存管理宝典这 (2025-12-25 08:19:46)