Thanks for your idea.
I have cases like this:
/1/1
/1/2/3/2
Since the first string /1/1 is smaller than the /1/2 (1 is < 2) of the
/1/2/3/2, I should able to stop comparison by looking at the 4th
character (/1/2) of '/1/2/3/2'.
So for cases like that, I would like to stop as soon as i can tell one
string is shorter than the other, instead of splitting the whole
string.
On 2/17/07, Pavol Droba
Hi,
Meryl Silverburgh wrote:
Hi,
I need to compare 2 strings in this format (a integer separator by '/': /1/1 /1/1/2 /1/1/3
so "/1/1" is less than "/1/1/2" and "/1/1/2" is less than " "/1/1/3".
Is there anything in Boost string library to help me to write such a comparison? Is there a string iterator which literates base on the separator '/'? My idea is to find an iterator to loop thru the string based on separator '/'.
There is a split_iterator which you can use. And there is a generic lexicographical_compare function.
I've got an idea that might work. But it is a little elaborate. First, tokenize your string using split, but store the result to vector
. Then define a comparison function, that will take the two iterator_ranges and compare them. Note, that in this case, tha range should hold an integer string. Then simply use lexicographical_compare for the comparison.
vector
vec1; split(vec, s1); vector vec2; split(vec, s2); if(lexicographical_compare(vec1, vec2, integer_compare)) { // s1 is less } You can even throw away the vector, and directly create an iterator_range from the split_iterator. This way you may spare some unnecessary tokenization.
typedef split_iteratorstring::const_iterator string_split; iterator_range
r1( make_split_iterator(s1, is_any_of("/")), string_split()) iterator_range
r2( make_split_iterator(s2, is_any_of("/")), string_split()) if(lexicographical_compare(vec1, vec2, integer_compare)) { // s1 is less }
Best Regards, Pavol. _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users