STL::Sort + CString

DontKissBossAss 2011-03-08 05:44:05
我自定义一个类,
class mycalss
{
public:
CString str;
// 没有复制构造函数,没有 = 函数,
BOOL operator <(const myclass &me){return str < me.str;}
};

现在,有一个数组mycalss ms[5]; 全部填满真是值,当我调用

sort(ms[0], ms[5]);

追踪发现stl使用插入排序,当第一次产生临时对象是出错了,定位于CString的复制构造函数,后来我为myclass添加了copy构造
实现如下
mycalss(const mycalss &me){str = me.str};

再次运行发现还是有问题,说是 me.str是空的, 但是苍天作证,他真是有值的,怎么回事
...全文
158 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
DontKissBossAss 2011-03-08
  • 打赏
  • 举报
回复
谢谢各位牛人。 了解了。
yshuise 2011-03-08
  • 打赏
  • 举报
回复
struct less{
template <typename T>
bool operator()(const T* lhs, const T* rhs)
{
return lhs->str < rhs->str;
}
};

sort(...begin(),.....end(), less());
qq120848369 2011-03-08
  • 打赏
  • 举报
回复

sort(ms, ms+5);
yshuise 2011-03-08
  • 打赏
  • 举报
回复
楼主你排序的是指针。
有两个解决方法:
第一,存对象。
第二,sort要传入函数对象。
zhengjiankang 2011-03-08
  • 打赏
  • 举报
回复
不好意思是5个指针。。
pengzhixi 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pengzhixi 的回复:]
你有没有按照我说的去掉后再试试呢?另外你给sort函数的范围也是有问题的。
[/Quote]
额 看了下,范围没错误。但是数组前面的*肯定是影响到sort了。
zhengjiankang 2011-03-08
  • 打赏
  • 举报
回复
这个是创建的带MFC库的控制台程序。
在stdafx里面对MFC库的引用就没有写出来了。
DontKissBossAss 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pengzhixi 的回复:]
你有没有按照我说的去掉后再试试呢?另外你给sort函数的范围也是有问题的。
[/Quote]

理解了,实际上有星号的话,里面只有指针。
zhengjiankang 2011-03-08
  • 打赏
  • 举报
回复
给个测试代码你看看
#include <algorithm>
#include <vector>

using namespace std;



class myclass
{
public:
CString str;

bool operator < (const myclass& ob)
{
return str < ob.str;
}

myclass()
{
str = "";
}

myclass(const myclass& ob)
{
str = ob.str;
}

myclass(const char* pstr)
{
str = pstr;
}

myclass& operator = (const char* pstr)
{
str = pstr;
return *this;
}


};


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{

myclass ar;
vector<myclass> v;
ar = "mnsh";
v.push_back(ar);
ar = "efgh";
v.push_back(ar);
ar = "abce";
v.push_back(ar);
ar = "abmn";
v.push_back(ar);
ar = "strg";
v.push_back(ar);

std::sort(v.begin(), v.end());

return 0;
}


不是很明白。
你那个myclass *ar[5] 一个指针能装5个对象么
还有你sort函数下标从0到5是6个对象不越界么。
pengzhixi 2011-03-08
  • 打赏
  • 举报
回复
你有没有按照我说的去掉后再试试呢?另外你给sort函数的范围也是有问题的。
DontKissBossAss 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengzhixi 的回复:]
我在4楼给的提示看了没呢?如果是排一个数组里面的指针。比较的是什么?
[/Quote]

sort要的是指针
然后就是我结构是 myclass *mc[5];
然后为每一个 mc[i] 开辟空间,为str 赋随机值
这里没错吧,

sort(mc[0], mc[5]); stl在把 mc[0] 赋值给一个临时变量时发现str 是cdcdcdcd; 赋值引起CString 崩溃了。

我还是有点不理解您的意思
pengzhixi 2011-03-08
  • 打赏
  • 举报
回复
我在4楼给的提示看了没呢?如果是排一个数组里面的指针。比较的是什么?
DontKissBossAss 2011-03-08
  • 打赏
  • 举报
回复
class mycalss
{
public:
CString str;
// 没有复制构造函数,没有 = 函数,
BOOL operator <(const myclass &me){return str < me.str;}
};

myclass *mc[5];

for(0到4){mc[i] = new myclass; mc[i]->str = "rand value";}

sort(ms[0], ms[5]); 时发生崩溃。
王旺旺旺 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dontkissbossass 的回复:]

class mycalss
{
public:
CString str;
// 没有复制构造函数,没有 = 函数,
BOOL operator <(const myclass &me){return str < me.str;}
};

myclass *mc[5];
for(0到4){mc[i]->str = "rand value";}

sort(ms……
[/Quote]
mc存的都是指针啊, 真正的myclass实例存在哪里?
pengzhixi 2011-03-08
  • 打赏
  • 举报
回复
myclass *mc[5];
额 你自己看吧。去掉*
DontKissBossAss 2011-03-08
  • 打赏
  • 举报
回复
class mycalss
{
public:
CString str;
// 没有复制构造函数,没有 = 函数,
BOOL operator <(const myclass &me){return str < me.str;}
};

myclass *mc[5];
for(0到4){mc[i]->str = "rand value";}

sort(ms[0], ms[5]); 时发生崩溃。
王旺旺旺 2011-03-08
  • 打赏
  • 举报
回复
CString 好像存在缓冲区共享的问题, 所以赋值可能有隐患.
LinuxBirdMan 2011-03-08
  • 打赏
  • 举报
回复
能贴代码么

64,649

社区成员

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

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