If you have a map from something to large vectors, to insert into that map, you would first call value_type(). This would cause
the large vector to be copied. When you call insert(), the large vector would be copied a second time.
Here is a technique to get rid of one of the large vector copies:
#include <iostream>
#include <map>
using namespace std;
namespace {
typedef vector<unsigned> MyVectorType;
typedef map<unsigned, MyVectorType, less<unsigned> > U2VU;
U2U g_myU2U (less<unsigned>());
U2VU g_myU2VU(less<unsigned>());
} // end unnamed namespace
int main()
{
MyVectorType myVector;
myVector.push_back(1);
myVector.push_back(2);
myVector.push_back(3);
U2VU::value_type vt1(1,MyVectorType());
U2VU::value_type vt2(2,MyVectorType());
g_myU2VU.insert(vt1);
pair<U2VU::iterator, bool> ret;
ret = g_myU2VU.insert(vt2);
if (ret.second == true) { // This means the key was not already there,
// so the item was inserted.
std::cout << "Inserting vector into map via iterator" << std::endl;
ret.first->second = myVector;
}
std::cout << "U2VU has " << g_myU2VU.size() << " items in it." << std::endl;
return 0;
}
The trick was to insert a value_type() with an empty vector, and then use the returned iterator to set the vector part to the large vector, thus saving a copy of the large vector.

No comments:
Post a Comment