【S16】了解如何把vector和string数据传给旧的API
1、尽量使用vector和string替换数组,但是老的代码还是使用数组。如果老的接口期望是数组,怎么办?
需要把vector和string,暴露出数组接口,也就是第一个元素的地址。
2、考虑方法DoSomething(const int* pInt,size_t size),对于vector<int> vec,调用如下:
DoSomething(&vec[0], v.size());
这里有个问题,vec的大小可能为0,更安全的做法是:
if(!vec.empty())
{
DoSomething(&vec[0], v.size());
}
3、考虑,能不能使用begin()替换&vec[0]?
我们知道,begin返回迭代器,是对指针的封装,类似于指针。但是,不能把迭代器当成指针使用,可以使用&*begin(),这种方式与&vec[0]等价,显然&vec[0]更直观。
4、考虑DoSomething(const char* pa); 对于string str,调用如下:
DoSomething(str.c_str());
c_str返回一个char指针,指向字符串值,尾部再加一个空字符。str长度可以为0,返回空字符,内部也可以包含空字符。但是,DoSomething的处理是以第一个空字符作为结束。
5、vector暴露出指针,调用端修改元素的值,通常没有问题。但是不能增加新元素。因为在外部增加新元素,vector不知道,不去更新size,size产生不正确的结果。如果大小和容量相等,增加元素就会踩内存了。注意:对于排序的vector,修改vector的元素值,也会产生问题。因为修改元素值后,导致vector无序。
6、考虑C API数组初始化vector,很简单。如果C API数组初始化string呢?
可以先初始化vector<char>,vector<char>再去初始化string。当然,还可以解决更一般化的问题。先把C API数组写到vector,再把vector写到期望的STL容器中。对于逆向的转化,同样道理。先把STL容器的元素写到vector,再把vector传递给C API数组。也就是说,vector是一个适配器。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人