Finding the number of occurrences of a string in another string
I don't like nested loops.  They are generally unnecessry
and are often confusing. So instead of your two loops, I would extrac the
inner loop to a function, for example:

int key_search(const std::string&amp; s, const std::string&amp; key)
{
    int count = 0;
    size_t pos=0;
    while ((pos = s.find(key, pos)) != std::string::npos) {
        ++count;
        ++pos;
    }
    return count;
}


This searches the inputs string s for occurances of string key and returns
the number of matches.  A few things are worth noting:


The parameters are passed as const references - const because you don't change them and references for efficiency.
I used string::npos as the idicator of failure from strings find
method, instead of -1 (-1 would give a warning from the compiler if you have
sign conversion warnings enabled).
I didn't use a while(true) loop but instead used the return from s.find
directly to control the loop.
I pre-incremented variables instead of post-increment (++pos, not pos++)
which can be more efficient (although with built in types it makes no
difference). 
pos (your start) is of type size_t, not int. Or you could use std::string::size_type, which is the also size_t.
It is normal to prefix your use of standard library things with std::, so
string becomes std::string etc.


The main loop now just needs to call key_search

int i = 0;
for (auto it = keys.begin(); it != keys.end(); ++it){
    frequency[i] = key_search(s, *it);
    ++i;
}


With C++11 you can use auto to simplify the iterator definition.  You don't
show what frequency is, but I'm assuming it is an array (which are generally
best avoided in C++).