C++

How can I convert std::vector to a vector of pairs std::vector> using an STL algorithm?

I have a vector of integers:

std::vector values = {1,2,3,4,5,6,7,8,9,10};

Given that values.size() will always be even.

I simply want to convert the adjacent elements into a pair, like this:

std::vector<std::pair<int,int>> values = { {1,2}, {3,4} , {5,6}, {7,8} ,{9,10} };

I.e., the two adjacent elements are joined into a pair.

What STL algorithm can I use to easily achieve this? Is it possible to achieve this through some standard algorithms?

Of course, I can easily write an old-school indexed for loop to achieve that. But I want to know what the simplest solution could look like using range-based for loops or any other STL algorithm, like std::transform, etc.

Answer 1
Once we have C++23’s extension to , you can get most of the way there with std::ranges::views::chunk, although that produces subranges, not pairs.

#include
#include
#include </code>

int main()
{
std::vector values = {1,2,3,4,5,6,7,8,9,10};
auto chunk_to_pair = [](auto chunk)
{
return std::pair(*chunk.begin(), *std::next(chunk.begin()));
};
for (auto [first, second] : values | std::ranges::views::chunk(2) | std::ranges::views::transform(chunk_to_pair))
{
std::cout &lt;&lt; first &lt;&lt; second &lt;&lt; std::endl;
}
}

Alternatively, you could achieve a similar result by ziping a pair of strided views

#include
#include
#include

int main()
{
std::vector values = {1,2,3,4,5,6,7,8,9,10};
auto odds = values | std::ranges::views::drop(0) | std::ranges::views::stride(2);
auto evens = values | std::ranges::views::drop(1) | std::ranges::views::stride(2);
for (auto [first, second] : std::ranges::views::zip(odds, evens))
{
std::cout &lt;&lt; first &lt;&lt; second &lt;&lt; std::endl;
}
}

Null pointer check via “myPtr > 0”

In some legacy code I came across the following null pointer check.

if( myPtr > 0 ) {

}

Answer 1:

Are there any technical risks of checking for a null pointer via this if-check?

Ordered comparison between a pointer and an integer is ill-formed in C++ (even when the integer is a null pointer constant such as it is in this case). The risk is that compilers are allowed to, and do, refuse to compile such code.

You can rewrite it as either of these:

if(myPtr != nullptr)
if(myPtr)