Есть некоторые проблемы с вашим кодом.
1- temp = "", вам нужно задать временную пустую строку, иначе функция find () не будет работать для нее
2 - используя map, у вас будет только один экземпляр слова в карте, поэтому вам нужно вести подсчет каждого слова.
Ниже код подсчитывает и печатает количество слов данного массива с минимальными изменениями в вашем коде:
void countwords(string str,string words[],int n ){
map<string ,int > m1;
int i=0, cnt=0;
string temp = "";
while(i < str.size())
{
while(str[i]!=' ' && i<str.size() && str[i]!='.')
{
if(str[i]!=' ' && str[i]!='.')
temp+=str[i];
i++;
}
auto iii = m1.find(temp);
int count = 0;
if(iii != m1.end())
count = iii->second;
count+=1;
m1[temp]=count;
temp="";
i++;
}
for(int i=0; i != n; i++)
{
auto found = m1.find(words[i]);
if(found != m1.end())
std::cout << found->first << " " << found->second << std::endl;
else cout << words[i] << " " << "0" << std::endl;
}}