Plenty of minor updates

"unsigned"  as "unsigned int" is not defined. "typename" keyword for inside template will make it more specific as a replacement of "class" keyword. 
Template types you have used are "In", "Out", "P", "Pr", "IT" and "It". Regarding that they will make confusions, I removed "P" and used "Pr" for UnaryPredicate, and "BI" for Bidirectional Iterator, and "BPr" for BinaryPredicate. 
PS: Some of the changes may need to be checked before merging into the project~~~