我有兩個向量:矢量分配/插入和鑄造值賦給/插入
std::vector<Foo> original;
std::vector<Foo *> pointers;
目前,我打算過original
並使用push_back
將值從它複製到pointers
。
例如是這樣的:
pointers.push_back(&(*original.at(0));
反正有沒有做到這一點使用矢量的assign
或insert
方法?
感謝您的任何幫助。
我有兩個向量:矢量分配/插入和鑄造值賦給/插入
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>));
}
而且鑑於矢量元素contiguosly存儲,你也可以使用 counting iterator:
pointers.assign(
boost::make_counting_iterator(original.data()),
boost::make_counting_iterator(original.data() + original.size()));
請糾正我,如果我錯了,但不是在vector
所有成員在連續的內存?
我相信你可以使用insert
方法,你只需要弄清楚如何將sizeof(Foo)
添加到每個插入的指針中。
'vector'中的成員實際上是按順序存儲在內存中的。 *但是*整個存儲的位置可能會在另一個'vector'操作之後改變(例如,在insert()或reserve()之後)。不,這個問題所描述的操作不能用一個'insert'來完成。 –
如果'original'改變大小,那麼這是一個壞主意。不會保證'std :: vector'的內容保留在相同的地址上。 –
我知道:(我不能改變它,所以現在我必須每次都改變它,但是你知道有什麼方法嗎? – noko
也許可以解釋你想要這個的理由...你會在哪裏使用原件向量,你想在哪裏使用指針向量? – maditya