繁体   English   中英

C ++将pair <int,int>的向量复制到vector <int>

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

我有一个对的向量,我需要将它们线性复制到一个向量的向量。 我有以下代码,它运行良好,但我不确定在C ++中考虑struct padding问题是否安全。

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());

现在,我的问题是 - 上述代码是否安全? 如果没有,是否有一种优雅的方式来做而不编写循环?

std::transform和lambda函数怎么样?

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 ;});

如果你不能使用C ++ 11,并且可能“讨厌”使用循环进行线性复制

您可以使用仿函数:

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<<" ";

reinterpret_cast通常是坏消息。 你不能在目标向量中保留足够的空间,然后在对的源向量上调用std::for_each ,然后将函数/ lambda push_back作为第一个和第二个进入目标向量吗?

你担心结构填充问题是正确的,但我认为你并没有真正面对你的代码所做的核心假设:

我能治疗std::pair<int, int>为两个整数的阵列,与所述.first是在阵列中的第一个元素和.second是第二元件?

从“正确”的角度来看,我会说“不”。 您已经确定了填充问题,但也有字段的顺序。 真的没有保证.first具有比更低的内存地址.second

从“实用”的角度来看,我很惊讶你的代码不起作用。 [编辑:尼尔已经指出了一个具有填充问题的具体例子; 让我惊讶的颜色。 除了“糟糕的形式”,我现在认为代码在实践中被打破了。 ]

对于解决方案,您可以将for_each与自定义操作一起使用,该操作会推送该对的两个元素(未经测试的代码)

struct action {
    action ( vector<int> & target ) : t_(target) {}
    void operator () ( const pair &p ) const 
        { t_.push_back(p.first); t_.push_back(p.second); }
private:
    vector<int> &t_;
}

for_each ( test_vector.begin(), test_vector.end(), action(v));

你不需要任何想象力来解决这个问题。 一个简单的for循环可以做,特别是如果你不能使用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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM