0

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)
    }
    

在这种情况下是否有可能使用迭代器?有没有更好的算法来做到这一点?

[编辑]

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

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

现在最初当游戏开始时所有这些值都是 0。现在当玩家 5 传递时,score["Player5Name] 的值将变为 1,但所有其他值将保持 0。在训练结束时,这些值将被排序对于每个球员,根据谁球员的价值更大,主计分系统将被更新。因此,如果球员 5 有 100 次向前传球,并且这个值是最大的,并且没有其他人拥有它,那么这个球员将被分配 10 的值。如果玩家 3、7 和 9 有 90 次传球,排名第二,然后计算为 (9+8+7)/3 等等。Foo 类还有另一个 std::string 成员,它描述了玩家做了什么,因此向量可以通过适当的操作进行排序。

我希望这能澄清我正在努力做得更好的事情。

[/编辑]

4

1 回答 1

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
于 2013-02-02T02:30:25.153 回答