Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Copy a vector of pair<int,int> to a vector<int>

I've a vector of pair which I need to copy them linearly to a vector of ints. I've the following code which works well, but I'm not sure if it's safe considering struct padding issues in C++.

std::vector < std::pair<int, int> > test_vector;
for (int i=0;i<5;i++) {
    test_vector.push_back(std::make_pair(i,i*5));
}
std::vector<int> int_vec(test_vector.size() * 2);
std::copy(reinterpret_cast<int*>(&(*test_vector.begin())),reinterpret_cast<int*>(&(*test_vector.end())),int_vec.begin());

Now, my question is - Is the above code safe? If not, is there an elegant way to do it without writing a loop?

like image 309
rwb Avatar asked Feb 16 '23 01:02

rwb


2 Answers

How about std::transform and a lambda function ?

std::vector<int> v;
std::transform(test_vector.begin(), test_vector.end(), std::back_inserter(v), 
               [&v](const std::pair<int, int> &p) 
               { v.push_back( p.first);
                 return p.second ;});

If you can't use C++11, and probably "hate" doing linear copying using loops

You can use functor like:

struct X{
    X(std::vector<int> &x) :v(x){}
    int operator () (const std::pair<int, int> &p)
    {
        v.push_back(p.first);
        return p.second;
    }
    std::vector<int> &v;
};

std::vector<int> v; //Final vector

std::transform(test_vector.begin(), 
               test_vector.end(), 
               std::back_inserter(v), 
               X(v));

std::vector<int> ::iterator it;

for(it=v.begin() ; it!=v.end() ;++it)
  std::cout<<*it<<" ";
like image 107
P0W Avatar answered Feb 28 '23 07:02

P0W


You don't need any fanciness for this problem. A simple for loop will do, especially if you can't use C++11

std::vector < std::pair<int, int> > test_vector;
std::vector<int> int_vec; int_vec.reserve(test_vector.size() * 2);
for (std::vector < std::pair<int, int> >::const_iterator it = test_vector.begin(), end_it = test_vector.end(); it != end_it; ++it)
{
    int_vec.push_back(it->first);
    int_vec.push_back(it->second);
}
like image 22
Neil Kirk Avatar answered Feb 28 '23 07:02

Neil Kirk