Here are a pair of implementations that don't involve creating any extraneous buffers.
#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/algorithm/copy.hpp>   //for boost::copy
#include <chrono>
#include <iostream>
#include <string>
#include <experimental/string_view> //in clang or gcc; or use boost::string_ref in boost 1.53 or later; or use boost::iterator_range<char*> in earlier version of boost
#include <thread>
void method_one(std::experimental::string_view sv)
{
    for(auto b = sv.begin(), e = sv.end(), space = std::find(b, e, ' ')
        ; b < e
        ; b = space + 1, space = std::find(space + 1, e, ' '))
    {
        std::copy(b, space, std::ostreambuf_iterator<char>(std::cout));
        std::cout << " (pause) ";   //note that this will spit out an extra pause the last time through
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}
void method_two(std::experimental::string_view sv)
{
    boost::copy(
        sv | boost::adaptors::filtered([](const char c) -> bool
        {
            if(c == ' ')
            {
                std::cout << " (pause) ";   //note that this spits out exactly one pause per space character
                std::this_thread::sleep_for(std::chrono::seconds(1));
                return false;
            }
            return true;
        })
        , std::ostreambuf_iterator<char>(std::cout)
    );
}
int main() {
    const std::string s{"This is a string"};
    method_one(s);
    std::cout << std::endl;
    method_two(s);
    std::cout << std::endl;
    return 0;
}
Live on coliru, if you're into that.