如何实现int* p 与 vector p 的转换?

helen11 2006-06-17 05:18:38
新的程序中使用了vector <int*>,而一些经典算法的输入参数仍然使用传统的指针(或数组),
如何进行它们之间的转换?
谢谢!

有一个函数AddPoint1(int p0,int *&pV), 输入参数采用传统的指针(或数组),我在main()程序中定义了一个vector <int*> &p_I,但是编译出错:cannot convert parameter 2 from 'std::vector<_Ty>' to 'int *&。
如何实现调用?

int AddPoint1(int p0,int *&pV);
main()
{
vector <int*> p_V;
int i0;

AddPoint1(i0,p_V);
}

同样,如何实现int* p 到 vector <int*> 的转换?
int AddPoint(int p0,vector <int*> p_V);
main()
{
int* pV;
int i0;

AddPoint(i0,pV);
}
...全文
330 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hu_vane 2006-06-18
  • 打赏
  • 举报
回复
int *p[size] = {0};
-----------------------------
size是怎么回事?常量还是变量?
size为常量时,VC2005编译正常。如果是变量,LZ要补补数组声明的基础了。
helen11 2006-06-18
  • 打赏
  • 举报
回复
使用上述办法不行啊!

如果都需要copy,很麻烦,STL没有提供转换机制?

另外,int *p[size] = {0};
vc2005编译出错
sharpdew 2006-06-18
  • 打赏
  • 举报
回复
直接用int *p = (int*)&vp[0]有一个小问题,就是向量数组大小不好控制
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有vector.size(),怎么会不知道大小呢!?
zzzace 2006-06-18
  • 打赏
  • 举报
回复
为什么在工作中很少有用stl的?
和2楼一样的问题:STL是大势所趋?
helen11 2006-06-18
  • 打赏
  • 举报
回复
vector <int*> vp;
vector <int> vp;
vector <int*> &vp;
vector <int> &vp;
这些有什么不同,类似传统的:
int* vp
int vp
int *&vp;
int &vp
????

有没有大虾推荐一本好的stl书?
helen11 2006-06-18
  • 打赏
  • 举报
回复
&v[0], 或
int* p = (int*)&vp[0];
参数传递失败!
helen11 2006-06-18
  • 打赏
  • 举报
回复
int *p[size] = {0};
vc2005编译错误:error C2057: expected constant expression
winks 2006-06-17
  • 打赏
  • 举报
回复
友情提示:
直接用int *p = (int*)&vp[0]有一个小问题,就是向量数组大小不好控制,因为vector向量的尾部是一个随机数,没有任何结束标识,建议还是copy一下吧:
vector <int*> vp;
const int size = vp.size() 1;
int *p[size] = {0};
for (int i = 0; i < vp.size(); ++i)
{
p[i] = vp[i];
}
这样就多了结束标识了。
sharpdew 2006-06-17
  • 打赏
  • 举报
回复
如何实现int* p 与 vector <int*> p 的转换?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果是已经有了vector<int*> vp, 那么要得到其中的int*p, 可以这样:
int* p = (int*)&vp[0];
也就是取得vector类中中的存储数据的连续内存的起始地址
helen11 2006-06-17
  • 打赏
  • 举报
回复
1 AddPoint函数肯定是不能重写的,这里仅仅是一个例子,大量的经典算法是不可能重写的。太耗时!
2 请jixingzhong“你用 C++ 写一个访问元素的函数不就可以了”讲详细的呀!

先谢了!
jixingzhong 2006-06-17
  • 打赏
  • 举报
回复
楼主,你用 C++ 写一个访问元素的函数不就可以了 ...

就是用 C++ 再包装一下,
返回的就是 这个 vector 的元素值就可以了 ...
LiuYinChina 2006-06-17
  • 打赏
  • 举报
回复
liking100(阿他)说得对,有用写v.begin()(取代&v[0]),其实,我也这样做,不过刚才忘了!
不过,我认为还是重新写AddPoint,最好!
万一,你一不心,push_back,万一,这时由,push_back引起vector的内存转移,
而AddPoint中的指针还没有更新(进了AddPoint,其实就不能更新指针了),
这时,程序就很可能...
LiuYinChina 2006-06-17
  • 打赏
  • 举报
回复
不能直接转换,vector中有别的变量,如begin(),end()的返回值,在vector中,是有成员变量存储的!内存结构不是单纯的指针数组.
就算转换成功,用操作指针数组的方法操作vector,是绝对不安全的
只有重新写AddPoint是最好的办法,我认为的话!
liking100 2006-06-17
  • 打赏
  • 举报
回复
楼主的问题,确实值得探讨的~呵呵

一些经典算法的输入参数仍然使用传统的指针,而STL中多用容器和迭代器~

vector容器是可以和经典算法相容的,因为vector的内存布局和数组一样~

其他的序列容器和关联容器就不可以了~因为内存不局不一样~

list 是基于节点的,deque是块分布的,关联容器是用平衡二叉树来实现的~

比如:

算法原型如下: void calgorithm(int *p,int size);

int main()
{
vector<int> v;
int p[size];
//填充v和p
calgorithm(p,size);//指针调用
calgorithm(&v[0],v.size());//STL容器调用
}

也有用写v.begin()(取代&v[0]),可能视vector<int> 的迭代器为int*,就可以匹配参数了

但也有时候这种写法也不一定正确~,因为vector<int> 的迭代器不一定可等价为int*!~

通常写&v[0]就可以了,如果非要用到begin()的话, &(*v.begin())写比较合适~

写&v[0]的时候要保证v[0]可以返回一个有效的引用值~


说通常应该多用vector而不是内置数组,

是考虑到可移植性和可调试行也许用内置数组要优于STL容器


个人的一些看法~(其实也很多是看Effective STL 学来的)

呵呵,希望对LZ有些帮助

helen11 2006-06-17
  • 打赏
  • 举报
回复
另外,高手们是否认为,一定要放弃原来的指针、数组,使用STL动态分配空间?
STL是大势所趋?

thanks

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧