Buttler made 105, his fourth ODI century, as England piled up 399 for nine, their highest one-day total against South Africa and their second highest of all time.
Buttler hit 11 fours and five sixes in a 76-ball innings which included a breathtaking variety of strokes. Alex Hales, Joe Root and Ben Stokes all hit half-centuries in an innings which included five partnerships worth 50 or more.
No fewer than eight batsmen hit sixes, with a total of 15 hits clearing some of the biggest boundaries in South Africa.
Fellow new ball bowler Marchant de Lange was punished for 31 in three overs as Roy and Hales raced to 62 off the first seven overs. The introduction of Morne Morkel into the attack brought the wicket of Roy, caught at cover, after he had made 48 off 30 balls in an opening stand of 68.
With England scoring at better than seven runs an over, Buttler was promoted up the order and he was quickly into his stride, pounding a half-century off 34 balls with six fours and three sixes. He reached his century off 73 deliveries which, remarkably, was the slowest of his four one-day international hundreds.