我有两个向量:
std::vector<Foo> original;
std::vector<Foo *> pointers;
目前,我正在检查original
并使用push_back
将值从它复制到pointers
.
例如这样的:
pointers.push_back(&(*original.at(0));
反正有没有使用向量assign
或insert
方法来完成这个?
感谢您提供任何帮助。
不,没有。
有很多原因导致您所做的事情最终会导致段错误或类似的错误。主要是,您的指针向量指向原始向量中元素的地址。当您推回原始向量时,元素可能会移动到其他地方并且地址不再有效。
如果您愿意将 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()));
如果我错了,请纠正我,但不是所有成员都vector
在连续记忆中吗?
我相信您可以使用该insert
方法,您只需要弄清楚如何将其添加sizeof(Foo)
到每个插入的指针中。