C ++ STL对向量进行排序

时间:2013-10-02 12:18:22

标签: c++

所以我试图对存储在矢量中的卡片矢量进行排序。

向量是std::vector<CUE> CUE是一个代表“评估中的卡片”的类,而里面的卡片是const Card*。我需要的是使用我创建的名为compareCards的函数对卡片进行排序。

但是,我生成以下错误:

  

错误C2784:'bool std :: operator&lt;(const std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;&amp;,const _Elem *)':   无法推断'const的模板参数   的std :: basic_string的&LT; _Elem,_Traits,_Alloc&GT; &安培;”来自'CUE'

函数声明位于另一个名为Table.h的文件中,排序调用位于Table.cpp中。这一切都是我正在制作的扑克游戏,但是整理手已经产生了一个让我停下来的错误。

如何在成功整理手牌时摆脱此错误?

以下是相关代码:

排序呼叫:

Table.cpp

std::sort(cardvec.begin(), cardvec.end(), compareCards);

功能声明:

Table.h

bool compareCards(const Card* c1, const Card* c2)
{   
    return c1->GetPip() < c2->GetPip(); 
}

CUE.h

#pragma once
#include <vector>
#include <iostream>
#include "card.h"

struct CUE
{
    CUE(void);
    ~CUE(void);
    CUE(const std::vector<const Card*>& c) : _cue(c){}
    std::vector<const Card*> _cue;
};

2 个答案:

答案 0 :(得分:1)

这是您所呈现的代码风格的一个工作示例(C ++ 98):

#include <algorithm>
#include <iostream>
#include <vector>

struct X {
  int n;
  X(int v) : n(v) {}
};

bool compare(const X* a, const X* b) {
  return a->n < b->n; }

int main() {
  std::vector<const X*> v;
  v.push_back(new X(5));
  v.push_back(new X(4));
  v.push_back(new X(6));

  for (int i = 0; i < v.size(); ++i) {
    std::cout << v[i]->n << " ";
  }
  std::cout << "\n";

  std::sort(v.begin(), v.end(), compare);

  for (int i = 0; i < v.size(); ++i) {
    std::cout << v[i]->n << " ";
  }
  std::cout << "\n";
}

输出

5 4 6
4 5 6

答案 1 :(得分:0)

作为Adam的答案的替代方案,使用更现代的风格(值而不是指针,初始化列表,比较器的lambda,基于循环的范围等)的类似解决方案。

您可以在此处看到它:http://coliru.stacked-crooked.com/a/96a4385814c7a4e5

#include <algorithm>
#include <iostream>
#include <vector>

struct X {
  int n;
  X(int v) : n(v) {}
};

void print(const std::vector<X>& container) {
    for (const auto& value : container) {
        std::cout << value.n << " ";
    }
    std::cout << "\n";
}

int main() {      
  std::vector<X> v{5, 4, 6};
  print(v);
  std::sort(v.begin(), v.end(), [](const X& a, const X& b){ return a.n < b.n; });
  print(v);
}