Вам очень повезло, что он не разбился.
tmp_color[tmp_color_idx] = tmp_color_idx;
В приведенной выше строке вы получаете доступ за пределами вектора.
reserve () не увеличивает размер вектора, следует использовать resize ().
Для меня метод, используемый Элальфером, даже лучше предварительно определить размер.