Uwe Stöhr <[EMAIL PROTECTED]> writes:
+void delete_opt(vector<string> & opts, char const * const * what)
+{
+       if (opts.empty())
+               return;
+
+       // remove found options from the list
+       // do this after handle_opt to avoid potential memory leaks and to be 
able
+       // to find in every case the last language option
+       vector<string>::iterator it;
+       for (; *what; ++what) {
+               it = find(opts.begin(), opts.end(), *what);
+               if (it != opts.end())
+                       opts.erase(it);
+       }
+}

Can't you use std::remove multiple times and then perform only one erase? 
Should be much more efficient, no?

See http://www.sgi.com/tech/stl/remove.html (it doesn't actually remove 
anything, just moves those iterators matching the predicate to the end...)

    typedef vector<string>::iterator iterator;
    iterator opts_end = opts.end();
    iterator const opts_begin = opts.begin();
    for (; *what; ++what)
    {
         opts_end = std::remove(opts_begin, opts_end, *what);
         if (opts_end == opts_begin)
             break;
    }

    std::erase(opts_end, opts.end();

Better still, use a predicate that itself loops over the what. Why are you 
using a c-string anyway? It's been a long time (and I get lost with pointers 
to pointers), but I think that the code below, or something like it should do 
the trick. Minimal re-working of your opts vector...

struct ContainsCharInCString
{
    private char const * const * cstring;

    ContainsCharInCString(char const * const * data) : this.cstring(data) {}

    bool operator(char input)
    {
        for (char const * const * ptr = cstring; *ptr; ++ptr)
        {
            if (input == *ptr)
                return true;
        }
        return false;
    }
}

    iterator new_end = std::remove_if(
        opts.begin(), opts.end(), ContainsCharInCString(what));
    std::erase(new_end, opts.end();

Angus


Reply via email to