我有一组课程项目:
std::set <Item> items;
class Item
{
private:
std::string name;
std::string serialNum;
int count;
double unitPrice;
public :
Item(std::string _name, std::string _serialNum, int _count, double _unitPrice);
Item(); // Ctor with no parameters , for compiling
~Item(); //Dtor
double totalPrice();
bool operator<(Item const & other)const;
bool operator>(Item& other);
bool operator==(Item& other);
void operator=(const Item& other);
void countUp();
void countDown();
void setup(std::string _name, std::string _serialNum, int _count, double _UnitPrice);
int getCount() const ;
std::string getName() const;
std::string getSerial() const ;
double getPrice() const ;
void printItem() const ;
};
我可以只使用一个值搜索集合吗? 例如,按项目::名称搜索。
答案 0 :(得分:1)
std::set
已订购(通常使用operator<
,您可以为您的类型重载)。通常,您决定一个特定订单。 (也许你的情况是serialNum
?)
如果您使用不同的标准搜索同一组,例如name
在您的情况下,您需要按元素遍历整个元素,因为设置顺序中没有任何利润。
为此,有标准算法std::find_if
,它在线性时间内执行此操作:
std::string name_to_find = "foo bar";
auto it = std::find_if(items.begin(), items.end(),
[name_to_find](const Item & i){ return i.getName() == name_to_find; });
将为您提供一个迭代器it
,指向集合中名为name_to_find
的第一项(如果集合中不存在此类元素,则为end-iterator)。它与您提供的容器类型无关,因此它适用于set,vector,arrays,...,并忽略容器的可能顺序。
上面的代码使用C ++ 11 lambda来提供字面内联的比较函数。如果您的编译器尚不支持(或者如果您想支持较旧的编译器),则必须使用仿函数来提供相同的功能。仿函数是一个类似于函数的类(可以使用operator()
调用)。
// Functor class to compare the name of an item with a specific name to look for
struct ItemByName {
// The functor needs to remember what we're looking for in a member variable
std::string name_to_find;
// Constructor initializing the name to look for
ItemByName(std::string name_to_find) : name_to_find(name_to_find) {}
// The call-operator which is called by the algorithm find_if
bool operator()(const Item &i) const {
// This is the same body as in the lambda
return i.getName() == name_to_find;
}
};
然后通过构造此仿函数的实例在find_if
中使用它:
std::set<Item>::iterator it = std::find_if(items.begin(), items.end(),
ItemByName(name_to_find));
请注意,现在,在具有显式类型的变量中捕获返回的值。在C ++ 11(上面)中,我们可以使用auto
来简化输入。
答案 1 :(得分:0)
Set description。
Set find,Set key comp。
创建集合时,您可以提供将用于比较元素的Compare
类。
根据规范:
二进制谓词,它接受与元素相同类型的两个参数并返回一个bool。表达式comp(a,b),其中comp是此类型的对象,a和b是键值,如果a被认为在函数定义的严格弱排序中的b之前,则返回true。 (...)默认为less,返回与应用less-than运算符相同(a
默认设置使用less<T>
来比较元素,但是您可以提供一个以您定义的方式比较项目的类。