vector的派生类如何有效访问数组元素?

kbsoft 2009-03-10 04:31:11
class Splitter : public std::vector<std::string>
{
char* operator[](const int n) const {return (*this)[n - 1].c_str();} // returns empty string if out of range

char* operator[]这个会返回vector中第n个字符串,但这个操作符在vector中也有定义。我想在派生类的operator[]实现中,去获取第n个元素,该如何获取呢?
...全文
219 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lightbear 2009-03-11
  • 打赏
  • 举报
回复
请看下帮助中对于c_str()的说明
AnsiString::c_str() returns a non const temporary pointer to the internal string buffer in the AnsiString object. The pointer is invalid once the statement in which it is used has finished executing. That is,don't do something like this:
char* cp = Edit1->Text.c_str();
char* cp2 = strtok( cp, " \t\n" ); // cp may no longer be valid
If you need a persistent pointer, you MUST copy the string into its own buffer:
char* cp = new char[ Edit1->Text.Length() + 1 ];
strcpy( cp, Edit1->Text.c_str() );
lightbear 2009-03-11
  • 打赏
  • 举报
回复
up
xtting_8984313 2009-03-10
  • 打赏
  • 举报
回复
感觉lz有几个误区呢,不知道是否正确?
1、至于那个const错误。因为c_str通常返回的是string类中的一块数据去,是不可以被修改的,所以可能返回的是const char*。如果需要你那样的形式,要么1、重新分配内存,再拷贝过去,返回,要注意内存释放;2、强制转换过去(需要c++强制转换),但不建议

2、stl算法中,通常使用的是传值操作,你的这种返回本身有问题,很难用在stl算法上。而且返回类型通常是type_name,也就是string.

3、即使某些算法可以使用,如果想如下操作,如何处理?
vectInstans[12] = xxxxxx;
这个xxxxx,在当前定义下,是无法传回去的

4、修改接口如下

vector<string>::iterator& operator[]{
.........
}
KevinYuen 2009-03-10
  • 打赏
  • 举报
回复
可以自己写一个string类呢~~:)

const_cast <char *>这个..不推荐
  • 打赏
  • 举报
回复
那你就保存一个char数组呗

class Splitter : public std::vector <std::string> 
{
vector<char> mvec;
public:
char* operator[](size_t n)
{
std::string& str = std::vector<std::string>::operator[](n-1);
mvec.clear();
mvec.insert( mvec.end() , str.begin(),str.end() );
return &mvec[0];
}
};

int main ()
{
Splitter x;
char* y= x[0];

}
nineforever 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kbsoft 的回复:]
谢谢各位,但是编译不过

f:\work\dash\branches\array\src\Splitter.h(19) : error C2228: left of '.c_str' must have class/struct/union
type is 'char *'
[/Quote]

class Splitter : public std::vector <std::string>
{
typedef std::vector <std::string> base;
const char* operator[](const int n) const {return (*(const base *)this)[n - 1].c_str();}
};

但是你这样会hide基类的operator[]
kbsoft 2009-03-10
  • 打赏
  • 举报
回复
Thanks a lot, All
pengzhixi 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 kbsoft 的回复:]
char* operator[](size_t n)
{
return const_cast<char *>(std::vector <std::string>::operator[](n-1).c_str());
}


接口如果一定不能是const的呢
[/Quote]

那这样试下
kbsoft 2009-03-10
  • 打赏
  • 举报
回复
KevinYuen 的代码很cool
KevinYuen 2009-03-10
  • 打赏
  • 举报
回复
那就修改<string>,string的内容不能无const输出吧
kbsoft 2009-03-10
  • 打赏
  • 举报
回复
const char* operator[](size_t n)
{
return std::vector<std::string>::operator[](n-1).c_str();
}


接口如果一定不能是const的呢
KevinYuen 2009-03-10
  • 打赏
  • 举报
回复
下标从几开始,在i那里改一下
kbsoft 2009-03-10
  • 打赏
  • 举报
回复
谢谢楼上,我也是这么写的,但是又得到error C2440: 'return' : cannot convert from 'const char *' to 'char *'
KevinYuen 2009-03-10
  • 打赏
  • 举报
回复
class Splitter : public vector<string>
{
public:
const char* operator[]( int i ) const
{
return (* (_Myfirst + i ) ).c_str();
}
};

int main()
{
Splitter Spt;
Spt.push_back( "1 sdf sd fsdf " );
Spt.push_back( "2 sdf sd fsdf " );
Spt.push_back( "3 sdf sd fsdf " );

cout << Spt[1];

return 0;
}
  • 打赏
  • 举报
回复

class Splitter : public std::vector <std::string>
{
public:
const char* operator[](size_t n)
{
return std::vector<std::string>::operator[](n-1).c_str();
}
};

int main ()
{
Splitter x;
const char* y= x[0];

}
Dinelgua 2009-03-10
  • 打赏
  • 举报
回复
std::vector <std::string>::operator[](n).c_str() ;
kbsoft 2009-03-10
  • 打赏
  • 举报
回复
To pengzhixi

还是同样的错误
kbsoft 2009-03-10
  • 打赏
  • 举报
回复
不想用组合,派生自STL我是想在外部遍历的时候可以用BOOST_FOREACH(),如果用组合,我就必须要添加begin()end()接口,使得代码太臃肿, looks ugly.........
xuhb95083023 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kbsoft 的回复:]
之所以要在Splitter中重新定义operator[],是因为vector是以0下标开始,而Splitter是从1开始
[/Quote]

用组合或者iterator adaptor应该都可以解决,继承std::vector并不是一种很好的解决方案,iterator adaptor可以参考reverse_iterator的实现
pengzhixi 2009-03-10
  • 打赏
  • 举报
回复
return this->vector<string>::operator[](n-1).c_str();
这样呢?
加载更多回复(6)

64,650

社区成员

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

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