2012-03-22 43 views
0

我想设置lower_bound和upper_bound以便多重结构遍历一个范围。如何正确设置字符串?在stl集中设置lower_bound

#include ... 
...  
struct foo{ 
    int bar; 
    string test; 
}; 

struct comp{ 
    inline bool operator()(const foo& left,const foo& right){ 
     return strcasecmp(left.test.c_str(), right.test.c_str()); 
    } 
}; 

int main(){ 
    std::multiset<foo,comp> fooset; 
    std::multiset<foo,comp>::iterator it, itLow; 

    ...//insert into fooset 

    //how do set lower_bound to element where string is "aab" or whatever? 

    return 0; 
} 

我该如何设置低指向字符串测试以“ab”开头的元素?

我想:

itLow = fooset.lower_bound("string"); 

我知道这是不够的......但我不知道该怎么做。

谢谢!

回答

1

你需要从字符串构建一个foo,然后使用lower_bound(或upper_bound,因为他情况而定)来搜索位置:

struct foo { 
    int bar; 
    string test; 

    foo(string i) : test(i) {} 
}; 

std::multiset<foo, comp> fooset; 

std:multiset<foo,comp>::iterator it = 
    std::lower_bound(fooset.begin(), fooset.end(), foo("string"), comp()); 
+0

及其'foo'一个构造函数,可以让你通过在一个字符串中,它被用来初始化'test'。 – 2012-03-22 18:30:10

+0

当我尝试对此进行测试时,我得到了最后一行的“从这里实例化”的错误。 另外...当我将'lower_bound'更改为'upper_bound'时,我无法解决错误。有任何想法吗?谢谢! – 2012-03-22 18:39:36

+0

@JayKim:糟糕 - 当您指定比较函数而不是使用'operator <'时,您还必须将它传递给'lower_bound',就像'std :: multiset :: iterator it = std :: lower_bound(fooset .begin(),fooset.end(),foo(“string”),comp());' – 2012-03-22 22:50:51