Re: Problem storing tvmet vector objects in an stl vector container
* alexjcollins@gmail.com:
The following program demonstrates the problem:
#include <vector>
#include <iostream>
#include <tvmet/Vector.h>
typedef tvmet::Vector<double, 3> Vector3d;
class Mesh
{
public:
Vector3d* addVertex(const Vector3d& tVertex);
private:
std::vector<Vector3d> m_tVertices;
};
Vector3d* Mesh::addVertex(const Vector3d& tVertex)
{ m_tVertices.push_back(tVertex);
return &m_tVertices.back();
}
int main()
{
Mesh tMesh;
Vector3d* pVertex0 = tMesh.addVertex(Vector3d(-1, 1, 1));
std::cout << "Vertex0: " << (*pVertex0)(0) << ", " << (*pVertex0)
(1) << ", " << (*pVertex0)(2) << std::endl;
Vector3d* pVertex1 = tMesh.addVertex(Vector3d( 1, 1, 1));
std::cout << "Vertex0: " << (*pVertex0)(0) << ", " << (*pVertex0)
(1) << ", " << (*pVertex0)(2) << std::endl;
std::cout << "Vertex1: " << (*pVertex1)(0) << ", " << (*pVertex1)
(1) << ", " << (*pVertex1)(2) << std::endl;
return 0;
}
Which gives the following output:
Vertex0: -1, 1, 1
Vertex0: 0, 1, 1
Vertex1: 1, 1, 1
Instead of the expected output:
Vertex0: -1, 1, 1
Vertex0: -1, 1, 1
Vertex1: 1, 1, 1
It is interesting to note that the code behaves correctly if an stl
list is used instead. I can't work out why this is not working, and it
seems like such a trivial program! Could anyone explain to me what is
wrong?
Adding to a vector may increase its capacity.
Increasing the capacity generally allocates a new larger internal buffer and
copies over from the old one, thus invalidating existing pointers, references
and iterators.
With a list each element is in its own dynamically allocated node (or as if),
and adding doesn't affect existing nodes except for linking them up.
Cheers & hth.,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?