redhat 9下用STL问题,请帮忙.

arpoul 2003-10-08 01:32:09
在调用vector的erase时,使用aa.begin(),aa.end()做参数没有问题,但使用&aa[3], &aa[7]就有问题,这个在windows下VC是没有问题的,如何解决?

例如:

using namespace std;

#include <vector>
#include <iostream>

typedef vector<int> Intvector;
int main()
{
Intvector vec;
int i;

for(i=0; i<10; i++)
{
vec.push_back(i);
}
for(i=0; i<vec.size(); i++)
{
cout<<vec[i]<<" ";
}
cout<<endl;

vec.erase(&vec[3], &vec[7]);

for(i=0; i<vec.size(); i++)
{
cout<<vec[i]<<" ";
}
cout<<endl;

return 0;
}

用 g++ -c test.cpp -o test.o编译,报错.
...全文
104 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljan 2003-10-22
  • 打赏
  • 举报
回复
good
south2000 2003-10-22
  • 打赏
  • 举报
回复
经典啊
Andy84920 2003-10-08
  • 打赏
  • 举报
回复
楼上说的我没有漏洞可以钻!  :)

真想反驳别人,我喜欢这样的成就感!可惜这时没有。:)

xueweizhong 2003-10-08
  • 打赏
  • 举报
回复
看看这个:
#include <vector>

int main()
{
int* p;
std::vector<int>::iterator i = p;
}

关键是是否存在 int* --> vector<int>::iterator
的隐式转换。

在VC版本中,我猜测vector<int>::iterator是个typedef:

temp...
class vect..
{
...
typedef T* iterator;
typedef T const* const_iterator;
...
};

而在G++版本中则不是一个指针类型的typedef:

a14.cpp:6: conversion from `int*' to non-scalar type `
__gnu_cxx::
__normal_iterator<int*, std::vector<int, std::allocator<int> > >'
requested

可以看出这个vector<int>::iterator定义不能实现
上面所说的隐式转换。

所以为了可移植性考虑,不要使用
vec.erase(&vec[3], &vec[7])
而应该使用
ezhou(煮花生)所说的
vec.erase(vec.begin()+3, vec.begin()+7);
Wolf0403 2003-10-08
  • 打赏
  • 举报
回复
erase 要求的参数是 iterator, operator[] 返回的是 reference
ezhou 2003-10-08
  • 打赏
  • 举报
回复
vec.erase(vec.begin()+3, vec.begin()+7);

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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