c ++ проблема с вектором push_back - PullRequest
0 голосов
/ 15 января 2011

UPDATE: Следующий код дает мне ошибку

Graph.cpp: в функции 'std :: ostream & оператор << (std :: ostream &, const Graph &) ': Graph.cpp: 43: ошибка: прохождение 'const std :: map>, станд :: меньше, std :: allocator>>>> 'as «этот» аргумент «_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] (const _Key &) [с _Key = long int, _Tp = std :: vector>, _Compare = std :: less, _Alloc = std :: allocator>>>] ' отбрасывает квалификаторы Graph.cpp: 44: ошибка: передача 'const std :: map>, станд :: меньше, std :: allocator>>>> 'as «этот» аргумент «_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] (const _Key &) [с _Key = long int, _Tp = std :: vector>, _Compare = std :: less, _Alloc = std :: allocator>>>] ' квалификаторы сбросов составляют [2]: * [build / Debug / GNU-MacOSX / Graph.o] Ошибка 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;
    }
}

Заранее спасибо,

Ответы [ 3 ]

4 голосов
/ 15 января 2011

Просто предположение, но вы пробовали

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

в соответствии с отклонением xy?

РЕДАКТИРОВАТЬ: кажется, что ОП изменил свой код, теперь мой ответ не соответствуетновый вопрос большеТем не менее, надеюсь, что мой ответ был полезен.

4 голосов
/ 15 января 2011

Я подозреваю, что вы имеете в виду Рэнд вместо MTRand:

Rand.rand()

MTRand - это имя типа. Rand - это имя экземпляра, который вы создали.

1 голос
/ 15 января 2011

Причина ваших проблем в том, что operator[] карты является изменяемой операцией (если ключ не существует, он будет добавлен к карте).

Вам придется использовать возвращенный итераторот 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) << " ";
...