如何在没有“排序”的情况下对对象向量进行排序
Posted
技术标签:
【中文标题】如何在没有“排序”的情况下对对象向量进行排序【英文标题】:How to sort vector of objects without "sort" 【发布时间】:2018-01-15 20:51:26 【问题描述】:那么我该怎么做呢?我尝试使用友元函数,重载运算符,但似乎无法完成。
class shop
int price;
string name;
string model;
public:
shop ()
price =0;
name = " NULL" ;
model = " NULL " ;
shop ( string n , string m , int p )
name = n;
model = m;
price = p;
void display ()
cout<<"Name : " << name <<endl;
cout<<"Model : "<<model<<endl;
cout<<"Price : "<<price<<endl;
;
如何按价格排序?
for ( int i = 1 ; i<=products ; i++)
cin.ignore();
cout<<"Name "<< i << ": ";
getline(cin,n);
cout<<"Model "<< i << ": ";
cin>>m;
cout<<"Price "<< i << ": ";
cin>>p[i];
e[i] = new shop(n,m,p[i]);
我有一个尝试排序的向量。我想不排序,因为我认为我没有为这个方法正确声明向量。
【问题讨论】:
您可以使用自定义比较器std::sort
。
Sorting a vector of custom objects的可能重复
没有腿怎么走路?如何在没有计算机的情况下运行程序?没有std::sort
如何排序?这些问题没有用。只需使用专为解决您的问题而制作的工具即可。
有大量使用数组的排序示例。向量可以使用数组表示法来访问元素。如果您不想使用默认的std::sort
,或带有自定义比较器的std::sort
,您可以使用qsort
或自己编写。
@jodag,manni66 可以根据for ( int i = 1 ; i<=products ; i++)
做出相当不错的猜测。 sebbyz 可能在vector
的开头分配了一个额外的空槽,但这更有可能是一个单独的错误。 Sebbyz、向量和数组是原点 0。它们从 0 开始计数,而不是 1。这意味着如果您没有考虑原点零,p[products]
可能超出范围。
【参考方案1】:
如果您不想使用任何内置排序功能,则必须手动实现。
// You can use this bubble sort...
for ( int i = 1 ; i<=products ; i++)
for(int j = 1; j <= (products-i+1); j++)
if(e[i].price > e[j].price)
swap(e[i], e[j]);
它的复杂度是O(N^2)
。当产品数量庞大时,这需要很长时间。您可以使用其他复杂的算法O(Nlog(N))
,例如合并排序、快速排序等,以使其更快。
【讨论】:
请阅读comments... 但我不能使用私人约会 for (int i = 1 ; i 我这样做了,但它没有交换我的最后一个对象 那么你就可以换两个店取一个额外的临时变量了。【参考方案2】:这是用 2 对向量进行排序的方法:
for (int i = 0; i < vec.size(); i++)
for (int j = i; j < (vec.size()); j++)
if (vec[i] > vec[j])
std::swap(vec[i], vec[j]);
【讨论】:
以上是关于如何在没有“排序”的情况下对对象向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在不单独指定所有列的情况下对所有列的 SQL 结果进行排序?