# Copy and bit-invert ints in an std::vector

I want a second copy of an std::vector in which all elements are inverted, e.g. 0x01 in the first vector should be 0xFE in the second.

Is this a good solution?

std::vector<uint8_t> first_list = {0x01, 0x10, 0x32, 0x1A };
std::vector<uint8_t> second_list = first_list;
for(std::vector<uint8_t>::iterator it = second_list.begin(); it != second_list.end(); ++it)
*it = ~*it;


The for loop sticks out to me as unnecessarily verbose.

You can use the new for() in C++11

std::vector<uint8_t> first_list = {0x01, 0x10, 0x32, 0x1A};
std::vector<uint8_t> second;
for(uint8_t& it: first_list)
{   second.push_back(~it);
}

• This kind of for loop is what I've been wishing for every time I've written one with an explicitly incrementing iterator! – Andreas Oct 4 '13 at 9:04

You can utilize std::transform here (I'll assume C++11 for the lambda):

int main()
{
std::vector<uint8_t> first_list = {0x01, 0x10, 0x32, 0x1A};
std::vector<uint8_t> second;
std::transform(first_list.begin(), first_list.end(), std::back_inserter(second),
[](uint8_t u) { return ~u; });
}


You also don't need to make a copy of the first vector to do this; better to simply use push_back (or back_inserter here, since we're working with iterators).

• Frankly, written out as a for loop is kind of less code than using transform with a lambda. – David Oct 4 '13 at 0:26