2013-04-01 65 views
1

我有兩個向量:矢量分配/插入和鑄造值賦給/插入

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

目前,我打算過original並使用push_back將值從它複製到pointers

例如是這樣的:

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

反正有沒有做到這一點使用矢量的assigninsert方法?

感謝您的任何幫助。

+0

如果'original'改變大小,那麼這是一個壞主意。不會保證'std :: vector'的內容保留在相同的地址上。 –

+0

我知道:(我不能改變它,所以現在我必須每次都改變它,但是你知道有什麼方法嗎? – noko

+0

也許可以解釋你想要這個的理由...你會在哪裏使用原件向量,你想在哪裏使用指針向量? – maditya

回答

2

不,沒有。

有很多原因會導致您最終會導致段錯誤或類似的錯誤。主要的是,你的指針向量指向原始向量中元素的地址。當您推回到原始矢量時,元素可能會移動到其他地方,並且地址不再有效。

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>)); 
} 

而且鑑於矢量元素contiguosly存儲,你也可以使用 counting iterator

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

請糾正我,如果我錯了,但不是在vector所有成員在連續的內存?

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

+0

'vector'中的成員實際上是按順序存儲在內存中的。 *但是*整個存儲的位置可能會在另一個'vector'操作之後改變(例如,在insert()或reserve()之後)。不,這個問題所描述的操作不能用一個'insert'來完成。 –