💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ### what 使开发者从char\*指针迁移到string对象 已经存在的遗留的C风格API接受的是数组和char\*指针,而不是 vector和string对象。这样的API函数还将会存在很长时间,如果我们要有效使用STL的话,就必须和它们和平 共处。 ### how 如果你有一个vector对象v,而你需要得到一个指向v中数据的指针,以使得它可以被当 作一个数组,只要使用&v[0]就可以了, 给定一个: ``` vector v; ``` 表达式v[0]生产一个指向vector中第一个元素的引用,所以,&v\[0\]是指向那个首元素的指针,vector中的元素 被C++标准限定为存储在连续内存中,就像是一个数组,所以,如果我们想要传递v给这样的C风格的API: ``` void doSomething(const int* pInts, size_t numInts); doSomething(&v[0], v.size()); // 调用 ``` 唯一的问题就是,如果v是空的。如果这样的话,v.size()是0,而&v\[0\]试图产生一个指向根 本就不存在的东西的指针。这不是件好事。其结果未定义。一个较安全的方法是这样: ``` if (!v.empty()) { doSomething(&v[0], v.size()); // 调用 } ``` 注意:begin的返回类型是iterator,而 不是一个指针,当你需要一个指向vector内部数据的指针时绝不该使用begin。 ` ` string 传入 ``` std::string s doSomething(s.c_str(), v.size()); // 调用 ` ```