$$$$$$$$$$$$$$$$$std list的排序问题...$$$$$$$$$$$$$

时间:2021-06-14 19:35:22
list <string> szTitle;
然后向list之中填充如下8个值,

.NetFramework
Active Setup
File Manager
Windows
CurrentVersion
Policies
Volatile Environment
{6BC0989F-0CE6-11D1-BAAE-00C04FC2E20D}

再sort一下,
szTitle.sort();

这时,在list之中上面8个值将会以如下顺序排列:

.NetFramework
Active Setup
CurrentVersion
File Manager
Policies
Volatile Environment
Windows
{6BC0989F-0CE6-11D1-BAAE-00C04FC2E20D}

现在问题是,我想让list之中的8个值按如下顺序排列,该如何做呢?

{6BC0989F-0CE6-11D1-BAAE-00C04FC2E20D}
.NetFramework
Active Setup
CurrentVersion
File Manager
Policies
Volatile Environment
Windows

6 个解决方案

#1


class my_compare
{
public:
     bool operator()(const std::string& x, const std::string& y) const
     {
         const char* str1 = x.c_str();
         const char* str2 = y.c_str();
         int str1_len = x.length();
         int str2_len = y.length();
         int size = 0;
         
         if(str1_len > str2_len)
             size = str2_len;
         else
             size = str1_len;
             
         for(int i = 0; i < size; i++ )
         {
                  if(str1[i] == '{')
                       return true;
                  if(str1[i] > str2[i] || str2[i] == '{')
                       return false;        
         }             
         return true;
     }      
};

int main(void)  
{  
  list<string> l;
  l.push_back(".NetFramework");
  l.push_back("Active Setup");
  l.push_back("CurrentVersion");
  l.push_back("File Manager");
  l.push_back("Policies");
  l.push_back("Volatile Environment");
  l.push_back("Windows");
  l.push_back("{6BC0989F-0CE6-11D1-BAAE-00C04FC2E20D}");
  l.sort(my_compare());
  
  copy(l.begin(), l.end(), ostream_iterator<string>(cout, "\n"));

}

#2


这个要用list::sort排序,并且就算是去掉重复的元素,也应该用list::unique去去除

#3


没看题目就答了……
 
同意楼上,需要创建自己的函数对象进行比较,否则调用默认的operator<会造成排序结果不正确。

楼上定义了一个my_compare(的提供了operator())的类作为伪函数来提供这个比较。

#4


同意鸡丁.楼上说的正确.

#5


修改版(偷懒版)my_compare……

class my_compare
{
public:
     bool operator()(const std::string& x, const std::string& y) const
     {
 if( ( x[0] != y[0] ) && ( x[0] == '{'))
 return true;
 if( y[0] == '{' )
 return false;
 return x<y;
 }
};

#6


class my_compare
{
public:
bool operator()(const std::string& x, const std::string& y) const
{
const char* str1 = x.c_str();
const char* str2 = y.c_str();
int str1_len = x.length();
int str2_len = y.length();
int size = str1_len > str2_len ? str2_len : str1_len;

for(int i = 0; i < size; i++ )
{
if( str1[i] == str2[i] )
continue;
if(str1[i] == '{' && str2[i] >= 'A')
return false;
if(str2[i] == '{' && str1[i] >= 'A')
return true;
return str1[i] < str2[i] ? false : true;
}             
return true;
}      
};
一般使用版……

#1


class my_compare
{
public:
     bool operator()(const std::string& x, const std::string& y) const
     {
         const char* str1 = x.c_str();
         const char* str2 = y.c_str();
         int str1_len = x.length();
         int str2_len = y.length();
         int size = 0;
         
         if(str1_len > str2_len)
             size = str2_len;
         else
             size = str1_len;
             
         for(int i = 0; i < size; i++ )
         {
                  if(str1[i] == '{')
                       return true;
                  if(str1[i] > str2[i] || str2[i] == '{')
                       return false;        
         }             
         return true;
     }      
};

int main(void)  
{  
  list<string> l;
  l.push_back(".NetFramework");
  l.push_back("Active Setup");
  l.push_back("CurrentVersion");
  l.push_back("File Manager");
  l.push_back("Policies");
  l.push_back("Volatile Environment");
  l.push_back("Windows");
  l.push_back("{6BC0989F-0CE6-11D1-BAAE-00C04FC2E20D}");
  l.sort(my_compare());
  
  copy(l.begin(), l.end(), ostream_iterator<string>(cout, "\n"));

}

#2


这个要用list::sort排序,并且就算是去掉重复的元素,也应该用list::unique去去除

#3


没看题目就答了……
 
同意楼上,需要创建自己的函数对象进行比较,否则调用默认的operator<会造成排序结果不正确。

楼上定义了一个my_compare(的提供了operator())的类作为伪函数来提供这个比较。

#4


同意鸡丁.楼上说的正确.

#5


修改版(偷懒版)my_compare……

class my_compare
{
public:
     bool operator()(const std::string& x, const std::string& y) const
     {
 if( ( x[0] != y[0] ) && ( x[0] == '{'))
 return true;
 if( y[0] == '{' )
 return false;
 return x<y;
 }
};

#6


class my_compare
{
public:
bool operator()(const std::string& x, const std::string& y) const
{
const char* str1 = x.c_str();
const char* str2 = y.c_str();
int str1_len = x.length();
int str2_len = y.length();
int size = str1_len > str2_len ? str2_len : str1_len;

for(int i = 0; i < size; i++ )
{
if( str1[i] == str2[i] )
continue;
if(str1[i] == '{' && str2[i] >= 'A')
return false;
if(str2[i] == '{' && str1[i] >= 'A')
return true;
return str1[i] < str2[i] ? false : true;
}             
return true;
}      
};
一般使用版……