1

我有两个向量:

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

目前,我正在检查original并使用push_back将值从它复制到pointers.

例如这样的:

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

反正有没有使用向量assigninsert方法来完成这个?

感谢您提供任何帮助。

4

3 回答 3

2

不,没有。

有很多原因导致您所做的事情最终会导致段错误或类似的错误。主要是,您的指针向量指向原始向量中元素的地址。当您推回原始向量时,元素可能会移动到其他地方并且地址不再有效。

于 2013-04-01T20:27:43.950 回答
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>));
}

鉴于向量元素是连续存储的,您还可以使用 计数迭代器

pointers.assign(
    boost::make_counting_iterator(original.data()),
    boost::make_counting_iterator(original.data() + original.size()));
于 2013-04-01T20:40:33.290 回答
0

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

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

于 2013-04-01T20:44:52.530 回答