std :: sort算法

时间:2013-02-02 02:18:50

标签: c++ sorting vector

std::sort根据operator<进行排序。

现在考虑这个课程:

class Foo
{
private:
     int m_x;
public:
     Foo()
     {
          m_x = 0;
     };
     Foo(int a)
     {
          m_x = a;
     }
     bool operator<(const Foo &right) const
     {
          return m_x < right.m_x;
     };
     void Set( int a ) { m_x = a; };
     int Get() { return m_x; };
};

std::vector<Foo> myVec;

for( int i = 0; i < 10; i++ )
     myVec.push_back( Foo() );
myVec.at( 5 ).Set( 2 );
myVec.at( 2 ).Set( 3 );

std::sort( myVec.begin(), myVec.end() );
  1. 如何将元素定位在生成的排序向量中?
  2. 我需要做这样的事情:

    int counter = 0;
    for( int i = 0; i < myVec.size(); i++ )
    {
         if( myVec.at( i++ ).Get() == myVec.at( i ) )
         {
             counter++;
             continue;
         }
         else
         {
             // assign some variable some value
         }
         // perform some calculation (I have multiple elements with the same value)
    }
    
  3. 在这种情况下是否有可能使用迭代器?有没有更好的算法呢?

    [编辑]

    这是我想要做的。 我们说我有一支足球队。它有10名球员。对于每个球员来说,在训练期间或比赛期间都可以考虑一系列技术/战术价值。 所以,所有这些都存储如下:

    std::map<std::string,std::vector<Foo>> score;
    

    现在,当游戏开始时,所有这些值都是0.现在当玩家5向前传递时,得分[&#34; Player5Name]的值将变为1,但所有其他值将保持为0。 在训练结束时,这些值将针对每个玩家进行排序,并且取决于哪个玩家具有更大的价值,主要得分系统将被更新。 因此,如果玩家5向前传递100个并且该值是最大的,并且没有其他人拥有它,则该玩家被赋予10的值。 如果球员3,7和9有90次传球并且是第二名,则计算为(9 + 8 + 7)/ 3 等等。 Foo类有另一个std :: string成员,用于描述玩家所做的事情,以便通过适当的操作对矢量进行排序。

    我希望这能澄清我想要做得更好的事情。

    [/编辑]

1 个答案:

答案 0 :(得分:0)

由于您在[0,0,0,0,0,0,0,0,2,3]变量上定义了比较运算符,因此数组将排序为x

关于第二个代码片段,看起来您正试图以某种方式处理同一元素的多个实例。当您在同一语句中再次使用变量时,通常不希望增加变量。尝试类似:

int counter = 1;
for (int i = 1; i < myVec.size(); i ++) {
    if (myVec[i - 1].Get() == myVec[i].Get()) {
        counter ++;
        continue;
    }
    //the else clause is redundant, as you already have a continue above
    //process the multiple variables
}
//process the last variable