向量分配/插入和转换要分配/插入的值

时间:2013-04-01 20:25:11

标签: c++ vector

我有两个向量:

std::vector<Foo> original;
std::vector<Foo *> pointers;

目前,我正在使用original并使用push_back将值复制到pointers

e.g。像这样的东西:

pointers.push_back(&(*original.at(0));

无论如何使用向量的assigninsert方法来实现这一目标吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

不,没有。

有很多原因可以解释为什么你所做的最终会导致段错或类似的坏事。主要是,指针向量指向原始向量中元素的地址。当您回到原始向量时,元素可能会移动到其他位置,并且地址不再有效。

答案 1 :(得分:1)

如果您愿意将boost库添加到组合中,可以非常简洁地完成(使用boost::transform_iterator):

#include <boost/iterator/transform_iterator.hpp>
#include <memory> // for addressof

struct Foo {};

int main()
{
    std::vector<Foo> original;
    std::vector<Foo*> pointers;

    pointers.assign(
        boost::make_transform_iterator(original.begin(), std::addressof<Foo>),
        boost::make_transform_iterator(original.end(), std::addressof<Foo>));
}

考虑到矢量元素是连续存储的,你也可以使用 counting iterator

pointers.assign(
    boost::make_counting_iterator(original.data()),
    boost::make_counting_iterator(original.data() + original.size()));

答案 2 :(得分:0)

如果我错了请纠正我,但不是连续记忆中vector的所有成员?

我相信您可以使用insert方法,您只需要弄清楚如何将sizeof(Foo)添加到每个插入的指针中。