Plenty of minor updates

"unsigned"  as "unsigned int" is not defined. And the unsigned test failed. >_< Consider this test in *How Not to Program in C++* by Steve Oualline
```cpp
#include <iostream>

 int main()
{
 unsigned char ch; // The flag NOTICE: ch can be a signed character and it fails

 ch = 0xFF; // Set the flag

 // Check the flag
 if (ch == 0xFF)
 std::cout << "Success\n";
 else
 std::cout << "Fails\n";

 return (0);
}
```
 "typename" keyword for inside template will make it more specific as a replacement of "class" keyword. Functions with no variables written as "some_type foo(void);" will lead to ambiguous matches. 
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. 
You placed std::accumulate, std::partial_sum, std::adjacent_difference in <algorithm>, which are supposed to be in <numeric>. 
PS: Some of the changes may need to be checked before merging into the project~~~