问题
Is there a standard container that has the same general API as vector<T>
but that populates new locations via direct default construction?
Background:
I have a type that disallows copying but has a default constructor and what I really want to do is this:
vector<NoCopy> bag(some_size);
// use bag[i]'s
return; // bag & contents get correctly cleaned up.
However, this doesn't work because vector<T>(int)
is implemented in terms of default constructing an object and then copying it into each of the new locations.
Edit: Not C++0xB (a.k.a. C++11)
回答1:
One option would be to upgrade to a C++11-compliant Standard Library implementation.
In C++11, the vector(size_type)
constructor default constructs N elements into the container. It neither copies nor moves any elements.
Visual C++ 2010 does not support this C++11 feature; I believe the Visual C++ 11 Developer Preview does correctly support it though. I do not know whether recent versions of libstdc++ support this; I would suspect that libc++ does.
回答2:
Boost.Container, new in Boost 1.48, has a boost::container::vector
which provides this feature. It's C++03 conforming, with select C++11 features.
Well, there is one C++03 that boost::container::vector
doesn't conform with: vector<bool>
is actually a vector
of bool
s. Though I imagine most people would count that as a benefit.
回答3:
Call it a workaround, but when I need containers of NoCopy types I usually use boost::ptr_vector or std::vector< shared_ptr >.
Obviously, it's slightly more expensive, but luckily for me that has not been a problem for me yet.
The good thing about boost::ptr_vector is that it does automatic dereferencing on some accesses. Check out the docs.
来源:https://stackoverflow.com/questions/8330936/integer-index-able-raii-container-for-non-copyable-type