Алгоритм нахождения чисел без пар из большого потока данных?
uint32_t xor_all = 0;
uint32_t xor_bit[32] = {0};

....

for (i = 0; i < n; ++i) {
    xor_all ^= in;
    for (j = 0; j < 32; ++j) {
        if (in & (1 << j))
            xor_bit[j] ^= in;
    }
}

for (j = 0; j < 32; ++j) {
    if (xor_all & (1 << j)) {
        out1 = xor_bit[j];
        out2 = xor_all ^ xor_bit[j];
        break;
    }
}



Идея в том, что непарные числа должны различаться хотя бы одним битом.
Мы будем кроме общего ксора тащить по одному ксору для чисел, имеющих i-й бит установленным.
В конце общий ксор даст нам различающиеся биты, по одному из которых мы найдём одно из непарных чисел, а там и второе.
+1, писал то же самое. В зависимости от компилятора, на С++ можно использовать либо С++11 контейнеры (unordered_set), либо из пространства имен tr1 на более старых компиляторах, если такое присутствует. По сути, при решении в лоб, придется хранить как минимум половину значений, либо хранить как-то более хитро.

Чуть подумал: проблему с памятью можно обойти, если разрешено обходить числа не последовательно, а в случайном порядке.
Также можно воспрользоваться принципом «разделяй и властвуй», т.е. строить вышеописанным способом множества элементов без пары для небольших кусков исходного массива, а потом искать симметрическую разность (объединение без пересечения) этих множеств.
Так вы еще их в массив сохраняете? Сразу сохраняйте в используемую структуру при считывании (set, unordered_set, unordered_map — в tr1 точно есть).