
Thorsten Ottosen wrote:
Phil Endecott skrev:
Herve Bronnimann wrote:
Phil: Pardon my ignorance about ptr_vector, but you may be thinking about the wrong STL algorithm: try rotate instead of copy:
Yes, rotate would do something similar to the for loop in my example.
The point is that ptr_containers can't use mutating std::algorithms; instead, they provide their own implementations of some of them as members. rotate isn't one of them, so I need some other way of doing it.
You can access mutating iterators over the original containers by calling .base() no the iterators.
They are hen iterators over void*&, so you need to cast or use e.g. void_ptr_indirect_fun:
http://www.boost.org/libs/ptr_container/doc/indirect_fun.html
Thanks Thorsten. But I fear that's a worse solution for me, in terms of e.g. readability and lines of code, than simply using a std::container of pointers. What's ideally needed is for the missing std::algorithms to be added to the ptr_containers, but that could be quite a lot of work. I think that just a swap function would be sufficient for my current needs: void ptr_vector::swap(size_type a, size_type b); Thinking aloud: this is the first time that I've tried to use Boost.ptr_containers; the last time that I wanted something like this I didn't need the ownership that ptr_containers provides, but only the hidden pointer dereferencing. I ended up writing something of my own [*]. At the time I wondered if ptr_containers could have been factored into two independent units, i.e. the ownership feature, so that ~container deletes the pointees, and the hidden dereferencing, so that vec[n] is a T& not a T*. I now wonder whether the layering of the ptr_container over the std::container<pointer> could be explicit, so that the user can get at the underlying container-of-pointers when they want to. E.g.: std::vector<LargeThing*> vec_ptrs; ptr_vector_adaptor<LargeThing> vec_largethings(vec_ptrs); // ctor takes a reference // I can now use vec_largethings for read access; if I want to manipulate the // underlying pointers I can use vec_ptrs directly. [*] The code that I wrote was a "const string facade", i.e. a class that has the same interface as a const string but which doesn't own its data; instead, the constructor takes pointers to the start and end of the data. I use this with files that are read in in their entirety or mmap()ed; with e.g. a CSV or XML file you can quite efficiently build a std::map<string,string>-like data structure, without ever copying the data. If anyone is interested in this code, I could probably share it. Regards, Phil.