我有以下结构
enum quality { good = 0, bad, uncertain };
struct Value {
int time;
int value;
quality qual;
};
class MyClass {
public:
MyClass() {
InsertValues();
}
void InsertValues();
int GetLocationForTime(int time);
private:
vector<Value> valueContainer;
};
void MyClass::InsertValues() {
for(int num = 0; num < 5; num++) {
Value temp;
temp.time = num;
temp.value = num+1;
temp.qual = num % 2;
valueContainer.push_back(temp);
}
}
int MyClass::GetLocationForTime(int time)
{
// How to use lower bound here.
return 0;
}
在上面的代码中,我遇到了很多编译错误。我想我在这里做错了我是STL编程的新手,请你纠正我的错误在哪里?这样做有好处吗?
谢谢!
答案 0 :(得分:11)
谓词需要带两个参数并返回bool。
由于你的函数是一个成员函数,它的签名是错误的。
此外,您可能需要使用您的仿函数将Value与int,Value to Value,int to Value和int to int进行比较。
struct CompareValueAndTime
{
bool operator()( const Value& v, int time ) const
{
return v.time < time;
}
bool operator()( const Value& v1, const Value& v2 ) const
{
return v1.time < v2.time;
}
bool operator()( int time1, int time2 ) const
{
return time1 < time2;
}
bool operator()( int time, const Value& v ) const
{
return time < v.time;
}
};
这很麻烦,所以让我们减少它:
struct CompareValueAndTime
{
int asTime( const Value& v ) const // or static
{
return v.time;
}
int asTime( int t ) const // or static
{
return t;
}
template< typename T1, typename T2 >
bool operator()( T1 const& t1, T2 const& t2 ) const
{
return asTime(t1) < asTime(t2);
}
};
然后:
std::lower_bound(valueContainer.begin(), valueContainer.end(), time,
CompareValueAndTime() );
还有其他一些错误,例如在类声明的末尾没有分号,加上一个类的成员默认是私有的,这使得你的整个类在这种情况下是私有的。你在构造函数之前错过了public:
吗?
您的函数GetLocationForTime不返回值。您需要获取lower_bound的结果并从中减去begin()。该函数也应该是常量。
如果要在此插入此调用的意图,则考虑在向量中插入是O(N)操作的事实,因此向量可能是错误的集合类型。
请注意,lower_bound
算法仅适用于预先排序的集合。如果您希望能够在不连续求助的情况下查找不同的成员,则需要在这些字段上创建索引,可能使用boost multi_index
答案 1 :(得分:2)
一个错误是lower_bound的第四个参数(代码中的compareValue
)不能是成员函数。它可以是函子或自由函数。使它成为MyClass的朋友的自由功能似乎是最简单的。你也错过了return关键字。
class MyClass {
MyClass() { InsertValues(); }
void InsertValues();
int GetLocationForTime(int time);
friend bool compareValue(const Value& lhs, const Value& rhs)
{
return lhs.time < rhs.time;
}
答案 2 :(得分:2)
Class
关键字必须从较低的c
- class
开始。struct Value
类型错误qualtiy
而不是quality
using namespace std
使用没有它的STL类型。vector<value>
- 错误的类型value
而不是Value
我认为你必须首先检查它,然后才会发布这样简单的错误。 而这里的主要问题是比较函数不能成为类的成员。将它用作自由函数:
bool compareValue(const Value lhs, const int time) {
return lhs.time < time ;
}
答案 3 :(得分:0)
class
是关键字而不是“类”:
class MyClass {
其身体后面应加分号;
可能还有其他错误,但您可能需要将它们粘贴到问题中以获得进一步的帮助。
答案 4 :(得分:0)
您只想让compareValue()
成为正常功能。你现在实现它的方式,你需要一个MyClass
类型的对象。 std::lower_bound()
将尝试调用它的方式,它将传递两个参数,没有额外的对象。如果你真的希望它成为一个成员的功能,你可以使它成为static
成员。
也就是说,直接使用函数会有性能损失。您可能希望比较器类型具有inline
函数调用运算符:
struct MyClassComparator {
bool operator()(MyClass const& m0, MyClass const& m1) const {
return m0.time < m1.time;
}
};
...并使用MyClassComparator()
作为比较器。