如何在C ++中只删除一次列表中的特定元素?

时间:2016-01-12 18:35:46

标签: c++ list

我正在尝试用C ++创建一个简单的win32控制台应用程序,它将计算有多少匹配具有相同的分数。

例:
匹配一个分数是1:1
比赛两个得分是1:1
比赛三分为1:2

程序应在控制台中打印:
有2场比赛,得分1:1
有1场比赛,得分1:2

我创建了" match"宾语。

class match
{   

 public:
    int hostScore;
    int guestScore;

    match();
   ~match();
    void input();//This method is to input data in the object.
};

现在我想创建函数来计算具有相同分数的匹配。

void count(list<match> a)
{
     match game;
     int counter;

     do{
           game = a.front(); // I want to take the value of the first element in the list and assign it to "game".

           do{
                  a.deleteSpecificValueOnlyOneTime(game);// I want to delete list element with the value of "game" 1 time
                  counter++

           } while (I can DeleteSpecificValuesOneTime)

           cout<<"There are <<counter<<" matches with score <<game.hostScore<< ":" << game.guestScore<<endl;
           counter = 0;

      } while (a != a.Empty();)// While a is not empty.
}

我们的想法是从列表中的第一个元素中获取值,删除它一次,计算它,然后重复该过程,直到删除所有具有相同值的元素并计算发生的时间。

取第n个元素的值并执行相同的操作。

2 个答案:

答案 0 :(得分:0)

你可以在while循环中使用erase方法:

std::list<match>::iterator it = a.begin();
while (it != a.end())
{
    if (*it EQUALS game)
        it = a.erase(it);
    }
    else {
        it++;
    }
}

答案 1 :(得分:0)

最简单的选择是将所有元素放在一个集合中,然后将它们检索回列表。

为了能够这样做,你必须为匹配定义一个less运算符:

bool operator<(const match &lhs, const match &rhs){
  if(lhs.hostScore==rhs.hostScore){
    return lhs.guestScore<rhs.guestScore;
  }
  return lhs.guestScore<rhs.guestScore;
}

之后你几乎快完成了:

void make_elements_unique(std::list<match> &games){
  std::set<match> unique;
  //put all elements into the set:
  unique.insert(games.begin(), games.end());
  //clear list and copy all elements from the set to the list, they are unique:
  games.assign(unique.begin(), unique.end());
}

如果你寻找性能并且有很多游戏,那么unordered_set(c ++ 11)将是比std :: set更好的选择。