zzzbbx
zzzbbx

Reputation: 10131

c++ problem with vector push_back

UPDATE: The following code gives me an error

Graph.cpp: In function 'std::ostream& operator<<(std::ostream&, const Graph&)': Graph.cpp:43: error: passing 'const std::map >, std::less, std::allocator > > > >' as 'this' argument of '_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = long int, _Tp = std::vector >, _Compare = std::less, _Alloc = std::allocator > > >]' discards qualifiers Graph.cpp:44: error: passing 'const std::map >, std::less, std::allocator > > > >' as 'this' argument of '_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = long int, _Tp = std::vector >, _Compare = std::less, _Alloc = std::allocator > > >]' discards qualifiers make[2]: * [build/Debug/GNU-MacOSX/Graph.o] Error 1

class Graph {
public:
    Graph();
    Graph(const Graph& orig);
    virtual ~Graph();

    void clear();
    void rgg(lint, double);
    bool is_directed() { return directed; }
    friend ostream& operator<< (ostream&, const Graph&); 


private:
    map< lint, vector<lint> > adjList;
    vector< pair<double, double> > xy;
    double radius;
    MTRand Rand;
    bool directed;
};


void Graph::rgg(lint n, double r) {
    radius = r; directed = false;

    clear(); 

    for(lint i = 0; i < n; i++)
        xy.push_back(pair<double, double>(Rand.rand(), Rand.rand()));
}

ostream& operator<< (ostream& os, const Graph& inGraph) {
    for(lint i = 0; i < inGraph.nodes; i++) {
        os << i << " ";
        if( inGraph.adjList.find(i) != inGraph.adjList.end() ) {
            for(lint idx = 0; idx < (inGraph.adjList[i]).size(); idx++ )
                os << inGraph.adjList[i].at(idx) << " ";

        }
        os << endl;
    }
}

Thank you in advance,

Upvotes: 0

Views: 2194

Answers (3)

Doc Brown
Doc Brown

Reputation: 20044

Just a guess, but did you try

 xy.push_back(pair<double, double>(MTRand.rand(), MTRand.rand())

according to the declation of xy?

EDIT: seems the OP has changed it's code, now my answer does not match the new question any more. Nevertheless, hope my answer was useful.

Upvotes: 4

UncleBens
UncleBens

Reputation: 41331

The cause of your problems is that map's operator[] is a mutable operation (if the key doesn't exist, it will be added to the map).

You will have to use the iterator returned from find():

map< lint, vector<lint> >::const_iterator it = inGraph.adjList.find(i);
if (it != inGraph.adjList.end();
for(lint idx = 0; idx < it->size(); idx++ )
    os << it->at(idx) << " ";

Upvotes: 1

Mark Byers
Mark Byers

Reputation: 838156

I suspect that you mean Rand instead of MTRand:

Rand.rand()

MTRand is the name of the type. Rand is the name of the instance you created.

Upvotes: 4

Related Questions