如何关于使用 std::sort 对容器存储的指针进行排序
如何关于使用 std::sort 对容器存储的指针进行排序
struct _row
{
std::string m_name;
int m_age;
std::string m_sex;
bool operator< (const _row &r) const
{
return m_name.compare(r.m_name) >= 0?true:false;
}
bool operator< (const _row *r) const
{
return m_name.compare(r->m_name) >= 0?true:false;
}
};
void test_sort_by_point()
{
std::vector<_row *> r;
_row *r1 = new _row();
r1->m_age = 2;
r1->m_name = "aaaa";
r1->m_sex = "男";
r.push_back(r1);
r1 = new _row();
r1->m_age = 4;
r1->m_name = "dddd";
r1->m_sex = "男";
r.push_back(r1);
r1 = new _row();
r1->m_age = 1;
r1->m_name = "bbbb";
r1->m_sex = "男";
r.push_back(r1);
_row *r2 = new _row();
r2->m_age = 9;
r2->m_name = "cccc";
r2->m_sex = "男";
r.push_back(r2);
std::vector<_row *>::iterator it;
for(it=r.begin();it != r.end();++it)
{
std::cout<<(*it)->m_name<<" ";
}
std::cout<<endl;
//r.sort(std::less<_row*>());
std::sort(r.begin(),r.end());
for(it=r.begin();it != r.end();++it)
{
//_row * t = *it;
std::cout<<(*it)->m_name<<" ";
}
std::cout<<endl;
}
int main(int argc,char *argv[])
{
test_sort_by_point();
system("pause");
}
现在输出的结果是:
aaaa dddd bbbb cccc
aaaa dddd bbbb cccc
我希望得到的结果是:
aaaa dddd bbbb cccc
dddd cccc bbbb aaaaa
或者:
aaaa dddd bbbb cccc
aaaa bbbb cccc dddd
如果 std::vector<_row *> r,这个声明成 std::vector<_row> r;
就能很好的排序,达到我要的目的,按 _row 里面 m_name 排序,但是现在
r 里面存储的是指针,不能重载 bool operator<(const _row *,const _row *),
所以默认sort 里面的比较是两个指针的比较,不是指针所指的对象的比较,有什么
办法可以按对象比较呢
struct _row
{
std::string m_name;
int m_age;
std::string m_sex;
bool operator< (const _row &r) const
{
return m_name.compare(r.m_name) >= 0?true:false;
}
bool operator< (const _row *r) const
{
return m_name.compare(r->m_name) >= 0?true:false;
}
};
void test_sort_by_point()
{
std::vector<_row *> r;
_row *r1 = new _row();
r1->m_age = 2;
r1->m_name = "aaaa";
r1->m_sex = "男";
r.push_back(r1);
r1 = new _row();
r1->m_age = 4;
r1->m_name = "dddd";
r1->m_sex = "男";
r.push_back(r1);
r1 = new _row();
r1->m_age = 1;
r1->m_name = "bbbb";
r1->m_sex = "男";
r.push_back(r1);
_row *r2 = new _row();
r2->m_age = 9;
r2->m_name = "cccc";
r2->m_sex = "男";
r.push_back(r2);
std::vector<_row *>::iterator it;
for(it=r.begin();it != r.end();++it)
{
std::cout<<(*it)->m_name<<" ";
}
std::cout<<endl;
//r.sort(std::less<_row*>());
std::sort(r.begin(),r.end());
for(it=r.begin();it != r.end();++it)
{
//_row * t = *it;
std::cout<<(*it)->m_name<<" ";
}
std::cout<<endl;
}
int main(int argc,char *argv[])
{
test_sort_by_point();
system("pause");
}
现在输出的结果是:
aaaa dddd bbbb cccc
aaaa dddd bbbb cccc
我希望得到的结果是:
aaaa dddd bbbb cccc
dddd cccc bbbb aaaaa
或者:
aaaa dddd bbbb cccc
aaaa bbbb cccc dddd
如果 std::vector<_row *> r,这个声明成 std::vector<_row> r;
就能很好的排序,达到我要的目的,按 _row 里面 m_name 排序,但是现在
r 里面存储的是指针,不能重载 bool operator<(const _row *,const _row *),
所以默认sort 里面的比较是两个指针的比较,不是指针所指的对象的比较,有什么
办法可以按对象比较呢
...全文
相关推荐
C++中使用sort对常见容器排序.docx
sort从大到小排序
C++ std::vector详解[项目代码]
本文详细介绍了C++标准库中的动态数组容器std::vector的各种操作方法。std::vector是C++中常用的容器之一,能够动态调整大小并存储一组元素。文章涵盖了从基本操作如创建、初始化、访问元素,到高级功能如添加、删除元素、调整大小、遍历、排序和查找等。此外,还介绍了emplace_back、data、assign、reserve等特定方法的使用,以及operator[]和at的区别、迭代器的使用等。通过丰富的代码示例,帮助读者深入理解std::vector的功能和用法,适用于C++开发者提升对动态数组容器的掌握。
三十分钟掌握STL,STL使用技巧
很不错的文档 值得一看!三十分钟掌握STL,STL使用技巧
C++ list使用及迭代器详解[项目源码]
本文详细介绍了C++中list的使用方法及其迭代器的底层实现原理。内容涵盖了list的基本操作如push_back、push_front、insert、erase等,以及迭代器的分类和功能。文章还深入探讨了list迭代器的模拟实现,包括如何通过类封装节点指针并重载运算符来模拟指针行为。此外,还比较了list和vector在排序效率上的差异,并解释了为什么list不能直接使用算法库中的sort函数。最后,文章提供了list的完整模拟实现代码,帮助读者更好地理解list的内部工作机制。
三十分钟掌握STL.pdf
三十分钟掌握STL.pdf


