我有两个向量:
std::vector<Foo> original;
std::vector<Foo *> pointers;
目前,我正在使用original
并使用push_back
将值复制到pointers
。
e.g。像这样的东西:
pointers.push_back(&(*original.at(0));
无论如何使用向量的assign
或insert
方法来实现这一目标吗?
感谢您的帮助。
答案 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)
添加到每个插入的指针中。