This one applies to all languages so far:
a=a+b-(b=a);
A REALLY fast way of swaping a and b.
#include <iostream>
#include <string>
using namespace std;
int main (int argc, char*argv) {
float a; cout << «A:»; cin >> a;
float b; cout << «B:» ; cin >> b;
cout << «———————» << endl;
cout << «A=» << a << «, B=» << b << endl;
a=a+b-(b=a);
cout << «A=» << a << «, B=» << b << endl;
exit(0);
}
void Send(int * to, const int* from, const int count)
{
int n = (count+7) / 8;
switch(count%8)
{
case 0:
do
{
*to++ = *from++;
case 7:
*to++ = *from++;
case 6:
*to++ = *from++;
case 5:
*to++ = *from++;
case 4:
*to++ = *from++;
case 3:
*to++ = *from++;
case 2:
*to++ = *from++;
case 1:
*to++ = *from++;
} while (—n>0);
}
}
Preprocessor Tricks
The arraysize macro used in Chrome’s source:
- template <typename T, size_t N>
- char (&ArraySizeHelper(T (&array)[N]))[N];
- #define arraysize(array) (sizeof(ArraySizeHelper(array)))
This is better than the ordinary
<span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">array</span><span class="pun">)/</span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">array</span><span class="pun">[</span><span class="lit">0</span><span class="pun">])</span>because it raises compilation errors when the passed in array is just a pointer, or a null pointer whereas the simpler macro silently returns a useless value. For a detailed example, see PVS-Studio vs Chromium.
Predefined Macros:
- #define expect(expr) if(!expr) cerr << «Assertion « << #expr \
- » failed at « << __FILE__ << «:» << __LINE__ << endl;
- #define stringify(x) #x
- #define tostring(x) stringify(x)
- #define MAGIC_CONSTANT 314159
- cout << «Value of MAGIC_CONSTANT=» << tostring(MAGIC_CONSTANT);
The
<span class="pln">tostring</span>macro is a common trick used to expand macro values inside other macros. The Linux kernel uses a lot of macro tricks.
Using iterators for quickly dumping the contents of a container:
- #define dbg(v) copy(v.begin(), v.end(), ostream_iterator<typeof(*v.begin())>(cout, » «))
Sadly, this doesn’t work for
<span class="pln">pair</span>types so maps are out of scope.
Template Voodoo
Recursion:You can specialize your class templates for certain cases, so you can write down the base-case of a recursion and then define the generic template as a recursive combination of base cases.
For example, the following code calculates the values of the Choose function at compile time:
- template<unsigned n, unsigned r>
- struct Choose {
- enum {value = (n * Choose<n—1, r—1>::value) / r};
- };
- template<unsigned n>
- struct Choose<n, 0> {
- enum {value = 1};
- };
- int main() {
- // Prints 56
- cout << Choose<8, 3>::value;
- // Compile time values can be used as array sizes
- int x[Choose<25, 3>::value];
- }
More interesting examples at C++ Programming/Templates/Template Meta-Programming
Mostly Painless Memory Management and RAII
With certain restrictions, you can create templates for «smart» pointers that automatically deallocate resources when they go out of scope or reference count goes to 0. This is basically done by overloading
<span class="kwd">operator</span> <span class="pun">*</span>and
<span class="kwd">operator</span> <span class="pun">=</span>. Based on your use case, you can transfer ownership when the
<span class="kwd">operator</span> <span class="pun">=</span>is used, or update reference counts.
See Smart Pointer Guidelines — The Chromium Projects and http://code.google.com/searchfra…Argument-dependent name lookup aka Koenig lookup
When a function call cannot be matched to a name in the current namespace, other namespaces can be searched for a matching signature. This is why
<span class="pln">std</span><span class="pun">::</span><span class="pln">cout </span><span class="pun"><<</span> <span class="str">"Hi"</span><span class="pun">;</span>works even though
<span class="kwd">operator</span> <span class="pun"><<</span>is defined in the
<span class="pln">std</span>namespace.
See Argument-dependent name lookup
auto keyword
In C++ you can use auto to iterate over map,vector,set,..etc which specifies that the type of the variable that is being declared will be automatically deduced from its initializer or for functions it will the return type or it will be deduced from its return statements
So instead of :
- vector<int> vs;
- vs.push_back(4),vs.push_back(7),vs.push_back(9),vs.push_back(10);
- for (vector<int>::iterator it = vs.begin(); it != vs.end(); ++it)
- cout << *it << ‘ ‘;cout<<‘\n’;
just use :
- vector<int> vs;
- vs.push_back(4),vs.push_back(7),vs.push_back(9),vs.push_back(10);
- for (auto it: vs)
- cout << it << ‘ ‘;cout<<endl;
- //you can also change the values using
- vector<int> vs;
- vs.push_back(4),vs.push_back(7),vs.push_back(9),vs.push_back(10);
- for (auto& it: vs) it*=3;
- for (auto it: vs)
- cout << it << ‘ ‘;cout<<endl;
Declaring variable
- template<class A, class B>
- auto mult(A x, B y) -> decltype(x * y){
- return x * y;
- }
- int main(){
- auto a = 3 * 2; //the return type is the type of operator (x*y)
- cout<<a<<endl;
- return 0;
- }
The Power of Strings
- int n,m;
- cin >> n >> m;
- int matrix[n+1][m+1];
- //This loop
- for(int i = 1; i <= n; i++) {
- for(int j = 1; j <= m; j++)
- cout << matrix[i][j] << » «;
- cout << «\n»;
- }
- // is equivalent to this
- for(int i = 1; i <= n; i++)
- for(int j = 1; j <= m; j++)
- cout << matrix[i][j] << » \n»[j == m];
because
<span class="str">" \n"</span>is a
<span class="kwd">char</span><span class="pun">*</span>,
<span class="str">" \n"</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span>is
<span class="str">' '</span>and
<span class="str">" \n"</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span>is
<span class="str">'\n'</span>.
Some Hidden function
__gcd(x, y)
you don’t need to code gcd function.
- cout<<__gcd(54,48)<<endl; //return 6
__builtin_ffs(x)
This function returns 1 + least significant 1-bit of x. If x == 0, returns 0. Here x is int, this function with suffix ‘l’ gets a long argument and with suffix ‘ll’ gets a long long argument.
e.g: __builtin_ffs(10) = 2 because 10 is ‘…10 1 0′ in base 2 and first 1-bit from right is at index 1 (0-based) and function returns 1 + index.three)Pairing tricks
- pair<int, int> p;
- //This
- p = make_pair(1, 2);
- //equivalent to this
- p = {1, 2};
- //So
- pair<int, pair<char, long long> > p;
- //now easier
- p = {1, {‘a’, 2ll}};
Super include
Simply use<span class="com">#include</span> <span class="pun"><</span><span class="pln">bits</span><span class="pun">/</span><span class="pln">stdc</span><span class="pun">++.</span><span class="pln">h</span><span class="pun">></span>This library includes many of libraries we do need like algorithm, iostream, vector and many more. Believe me you don’t need to include anything else 😀 !!
Smart Pointers
Using smart pointers, we can make pointers to work in way that we don’t need to explicitly call delete. Smart pointer is a wrapper class over a pointer with operator like * and -> overloaded. The objects of smart pointer class look like pointer, but can do many things that a normal pointer can’t like automatic destruction (yes, we don’t have to explicitly use delete), reference counting and more.
The idea is to make a class with a pointer, destructor and overloaded operators like * and ->. Since destructor is automatically called when an object goes out of scope, the dynamically alloicated memory would automatically deleted (or reference count can be decremented).
You can put URIs in your C++ code and the compiler will not throw any error.
<span class="com">#include</span> <span class="str"><iostream></span> <span class="typ">int</span><span class="pln"> main</span><span class="pun">()</span> <span class="pun">{</span> <span class="kwd">using</span> <span class="kwd">namespace</span><span class="pln"> std</span><span class="pun">;</span> <span class="pln">http</span><span class="pun">:</span><span class="com">//www.google.com</span> <span class="typ">int</span><span class="pln"> x </span><span class="pun">=</span> <span class="lit">5</span><span class="pun">;</span> <span class="pln">cout </span><span class="pun"><<</span><span class="pln"> x</span><span class="pun">;</span> <span class="pun">}</span>Explanation: Any identifier followed by a : becomes a (goto) label in C++. Anything followed by // becomes a comment so in the code above, http is a label and //google.com/is a comment. The compiler might throw a warning however, since the label is unutilized.
Don’t Confuse Assign (=) with Test-for-Equality (==).
This one is elementary, although it might have baffled Sherlock Holmes. The following looks innocent and would compile and run just fine if C++ were more like BASIC:
if (a = b)
cout << «a is equal to b.»;Because this looks so innocent, it creates logic errors requiring hours to track down within a large program unless you’re on the lookout for it. (So when a program requires debugging, this is the first thing I look for.) In C and C++, the following is not a test for equality:
a = b
What this does, of course, is assign the value of b to a and then evaluate to the value assigned.
The problem is that a = b does not generally evaluate to a reasonable true/false condition—with one major exception I’ll mention later. But in C and C++, any numeric value can be used as a condition for “if” or “while.
Assume that a and b are set to 0. The effect of the previously-shown if statement is to place the value of b into a; then the expression a = b evaluates to 0. The value 0 equates to false. Consequently, aand b are equal, but exactly the wrong thing gets printed:if (a = b) // THIS ENSURES a AND b ARE EQUAL…
cout << «a and b are equal.»;
else
cout << «a and b are not equal.»; // BUT THIS GETS PRINTED!The solution, of course, is to use test-for-equality when that’s what you want. Note the use of double equal signs (==). This is correct inside a condition.
// CORRECT VERSION:
if (a == b)
cout << «a and b are equal.»;
The most amazing trick i found was a status of someone’s topcoder profile:
Code:
#include <cstdio>
double m[]= {7709179928849219.0, 771};
int main()
{
m[1]—?m[0]*=2,main():printf((char*)m);
}
You will be seriously amazed by the ouput…here it is:
C++SucksI tried to analyse the code and came up with a reason but not an exact explanation..so i tried to ask it on stackoverflow..you can go through the explanation here:
Concept behind this 4 lines tricky C++ code
Read it and you will learn something you wouldn’t have even thought of… 😉
Iteration:
<span class="com">#define</span><span class="pln"> FOR</span><span class="pun">(</span><span class="pln">i</span><span class="pun">,</span><span class="pln">n</span><span class="pun">)</span> <span class="kwd">for</span><span class="pun">(</span><span class="typ">int</span> <span class="pun">(</span><span class="pln">i</span><span class="pun">)=</span><span class="lit">0</span><span class="pun">;(</span><span class="pln">i</span><span class="pun">)<(</span><span class="pln">n</span><span class="pun">);(</span><span class="pln">i</span><span class="pun">)++)</span> <span class="com">#define</span><span class="pln"> FORR</span><span class="pun">(</span><span class="pln">i</span><span class="pun">,</span><span class="pln">a</span><span class="pun">,</span><span class="pln">b</span><span class="pun">)</span> <span class="kwd">for</span><span class="pun">(</span><span class="typ">int</span> <span class="pun">(</span><span class="pln">i</span><span class="pun">)=(</span><span class="pln">a</span><span class="pun">);(</span><span class="pln">i</span><span class="pun">)<(</span><span class="pln">b</span><span class="pun">);(</span><span class="pln">i</span><span class="pun">)++)</span> <span class="com">//reverse</span> <span class="com">#define</span><span class="pln"> REV</span><span class="pun">(</span><span class="pln">i</span><span class="pun">,</span><span class="pln">n</span><span class="pun">)</span> <span class="kwd">for</span><span class="pun">(</span><span class="typ">int</span> <span class="pun">(</span><span class="pln">i</span><span class="pun">)=(</span><span class="pln">n</span><span class="pun">)-</span><span class="lit">1</span><span class="pun">;(</span><span class="pln">i</span><span class="pun">)>=</span><span class="lit">0</span><span class="pun">;(</span><span class="pln">i</span><span class="pun">)--)</span>Handy way to use it like this.
<span class="kwd">typedef</span> <span class="kwd">long</span> <span class="kwd">long</span> <span class="typ">int</span> <span class="typ">int64</span><span class="pun">;</span> <span class="kwd">typedef</span> <span class="kwd">unsigned</span> <span class="kwd">long</span> <span class="kwd">long</span> <span class="typ">int</span> <span class="typ">uint64</span><span class="pun">;</span>FastIO for +ve integers.
<span class="kwd">inline</span> <span class="kwd">void</span><span class="pln"> frint</span><span class="pun">(</span><span class="typ">int</span> <span class="pun">*</span><span class="pln">a</span><span class="pun">){</span> <span class="kwd">register</span> <span class="kwd">char</span><span class="pln"> c</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="kwd">while</span> <span class="pun">(</span><span class="pln">c</span><span class="pun"><</span><span class="lit">33</span><span class="pun">)</span><span class="pln"> c</span><span class="pun">=</span><span class="pln">getchar_unlocked</span><span class="pun">();*</span><span class="pln">a</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span> <span class="kwd">while</span> <span class="pun">(</span><span class="pln">c</span><span class="pun">></span><span class="lit">33</span><span class="pun">){*</span><span class="pln">a</span><span class="pun">=*</span><span class="pln">a</span><span class="pun">*</span><span class="lit">10</span><span class="pun">+</span><span class="pln">c</span><span class="pun">-</span><span class="str">'0'</span><span class="pun">;</span><span class="pln">c</span><span class="pun">=</span><span class="pln">getchar_unlocked</span><span class="pun">();}</span> <span class="pun">}</span>
Try This….
#include <iostream>
using namespace std;
int main()
{
int a,b,c;
int count = 1;
for (b=c=10;a=»- FIGURE?, UMKC,XYZHello Folks,\
TFy!QJu ROo TNn(ROo)SLq SLq ULo+\
UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\
NBELPeHBFHT}TnALVlBLOFAkHFOuFETp\
HCStHAUFAgcEAelclcn^r^r\\tZvYxXy\
T|S~Pn SPm SOn TNn ULo0ULo#ULo-W\
Hq!WFs XDt!» [b+++21]; )
for(; a— > 64 ; )
putchar ( ++c==’Z’ ? c = c/ 9:33^b&1);
return 0;
}
I think one of the coolest of all time, is defining an abstract base class in C++, and inheriting from it in python, and passing it back to C++ to call.
It actually works
<span class="kwd">struct</span> <span class="typ">Interface</span><span class="pun">{</span> <span class="typ">int</span><span class="pln"> foo</span><span class="pun">()</span><span class="kwd">const</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span> <span class="kwd">virtual</span> <span class="pun">~</span><span class="typ">Interface</span><span class="pun">(){}</span> <span class="pun">};</span> <span class="kwd">void</span><span class="pln"> call</span><span class="pun">(</span><span class="typ">Interface</span> <span class="kwd">const</span><span class="pun">&</span><span class="pln"> f</span><span class="pun">){</span> <span class="pln"> std</span><span class="pun">::</span><span class="pln">cout</span><span class="pun"><<</span><span class="pln">f</span><span class="pun">.</span><span class="pln">foo</span><span class="pun">()<<</span><span class="pln">std</span><span class="pun">::</span><span class="pln">endl</span><span class="pun">;</span> <span class="pun">}</span> <span class="kwd">struct</span> <span class="typ">InterfaceWrap</span><span class="pln"> final</span><span class="pun">:</span> <span class="typ">Interface</span><span class="pun">,</span><span class="pln"> boost</span><span class="pun">::</span><span class="pln">python</span><span class="pun">::</span><span class="pln">wrapper</span><span class="pun"><</span><span class="typ">Interface</span><span class="pun">></span> <span class="pun">{</span> <span class="typ">int</span><span class="pln"> foo</span><span class="pun">()</span> <span class="kwd">const</span><span class="pln"> final</span> <span class="pun">{</span> <span class="kwd">return</span> <span class="kwd">this</span><span class="pun">-></span><span class="pln">get_override</span><span class="pun">(</span><span class="str">"foo"</span><span class="pun">)();</span> <span class="pun">}</span> <span class="pun">};</span> <span class="pln">BOOST_PYTHON_MODULE</span><span class="pun">(</span><span class="pln">interface</span><span class="pun">){</span> <span class="kwd">using</span> <span class="kwd">namespace</span><span class="pln"> boost</span><span class="pun">::</span><span class="pln">python</span><span class="pun">;</span> <span class="pln"> class_</span><span class="pun"><</span><span class="typ">Interface</span> <span class="pun">,</span><span class="pln">boost </span><span class="pun">::</span><span class="pln">noncopyable</span><span class="pun">,</span><span class="pln">boost</span><span class="pun">::</span><span class="pln">shared_ptr</span><span class="pun"><</span><span class="typ">Interface</span><span class="pun">>>(</span><span class="str">"_InterfaceCpp"</span><span class="pun">,</span><span class="pln">no_init</span><span class="pun">)</span> <span class="pun">.</span><span class="pln">def</span><span class="pun">(</span><span class="str">"foo"</span><span class="pun">,&</span><span class="typ">Interface</span><span class="pun">::</span><span class="pln">foo</span><span class="pun">)</span> <span class="pun">;</span> <span class="pln"> class_</span><span class="pun"><</span><span class="typ">InterfaceWrap</span> <span class="pun">,</span><span class="pln">bases</span><span class="pun"><</span><span class="typ">Interface</span><span class="pun">>,</span><span class="pln">boost</span><span class="pun">::</span><span class="pln">shared_ptr</span><span class="pun"><</span><span class="typ">InterfaceWrap</span><span class="pun">>>(</span><span class="str">"Interface"</span><span class="pun">,</span><span class="pln">init</span><span class="pun"><>())</span> <span class="pun">;</span> <span class="pln"> def</span><span class="pun">(</span><span class="str">"call"</span><span class="pun">,&</span><span class="pln">call</span><span class="pun">);</span> <span class="pun">}</span>and then
<span class="kwd">import</span><span class="pln"> interface </span><span class="kwd">as</span><span class="pln"> i </span><span class="com"># C++ code</span> <span class="kwd">class</span><span class="pln"> impl</span><span class="pun">(</span><span class="pln">i</span><span class="pun">.</span><span class="typ">Interface</span><span class="pun">):#</span><span class="pln">inherit </span><span class="kwd">from</span><span class="pln"> C</span><span class="pun">++</span> <span class="kwd">class</span> <span class="kwd">def</span><span class="pln"> __init__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">):</span> <span class="pln"> i</span><span class="pun">.</span><span class="typ">Interface</span><span class="pun">.</span><span class="pln">__init__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">)</span> <span class="kwd">def</span><span class="pln"> foo</span><span class="pun">(</span><span class="pln">self</span><span class="pun">):</span> <span class="kwd">return</span> <span class="lit">100</span> <span class="pln">i</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">impl</span><span class="pun">())#</span><span class="pln">call C</span><span class="pun">++</span><span class="pln"> function </span><span class="kwd">with</span> <span class="typ">Python</span><span class="pln"> derived </span><span class="kwd">class</span>This does exactly what you think it should do.
void qsort ( void * base, size_t num, size_t size, int ( * compar ) ( const void *, const void * ) )
base Pointer to the first element of the array to be sorted.
num Number of elements in the array pointed by base. size_t is an unsigned integral type.
size Size in bytes of each element in the array. size_t is an unsigned integral type.
compar Function that compares two elements. This function is called repeatedly by qsorttocomparetwoelements.It shall follow the following prototype:
int compar ( const void * elem1, const void * elem2 );
Taking a pointer to two pointers as arguments (both type-casted to const void*). The function should compare the data pointed by both: if they match in ranking, the function shall return zero; if elem1 goes before elem2, it shall return a negative value; and if it goes after, a positive value.
Eg :
int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b) { return ( *(int*)a — *(int*)b ); }
int main () {
int n;
qsort (values, 6, sizeof(int), compare);
for (n=0; n<6; n++) printf («%d «,values[n]); return 0; }
This is a very amazing piece of code:
main(a){printf(a,34,a=»main(a){printf(a,34,a=%c%s%c,34);}»,34);}
It is the shortest C++ code which when executed prints itself. It was discovered by Vlad Taeerov and Rashit Fakhreyev and is only 64 characters in length(Making it the shortest).
To Convert list<T> to vector<T>:
-
<span class="pln">std</span><span class="pun">::</span><span class="typ">vector</span><span class="pun"><</span><span class="pln">T</span><span class="pun">></span><span class="pln"> v</span><span class="pun">(</span><span class="pln">l</span><span class="pun">.</span><span class="pln">begin</span><span class="pun">(),</span><span class="pln"> l</span><span class="pun">.</span><span class="pln">end</span><span class="pun">());</span>