2015-05-19 2 views
1

В целях тестирования я запускаю следующий код через цикл for. На самом деле существуют только первые три ключа, и «Запись найдена» отображается, как ожидалось, вместе с ключом, полученным от findVertex->first.STL Map - отображение того, на что указывает функция find()

  • Мой вопрос: как я могу получить доступ ко второму указанному значению?

findVertex->second кажется очевидным, но не работает, так как второе значение является объект, который я создал, заявление которого приводится ниже код, если это было бы никакой пользы. Код

for(int i = 0; i<10; i++) 
    { 
    map<int, vector<Vertex> >::const_iterator findVertex = vertexMap.find(i); 

    if(findVertex != vertexMap.end()) 
     { 
      cout<<"\nRecord found: "; 
      cout<<findVertex->first; 
      cout<<findVertex->second; //does not work 
     } 
    else 
     cout<<"\nRecord not found"; 
} 

Класс:

class Vertex 
{ 
    private: 
     int currentIndex; 
     double xPoint, yPoint, zPoint; 
     vector<double> attributes; 

    public: 
     friend istream& operator>>(istream&, Vertex &); 
     friend ostream& operator<<(ostream&, Vertex &); 
}; 

Благодаря

+0

Обеспечение оператор: 'std :: ostream & operator << (std :: ostream &, const std :: vector &)' –

ответ

1

Прежде всего вы не можете использовать const_iterator

map<int, vector<Vertex> >::const_iterator findVertex = vertexMap.find(i); 

для отображения Vertex, потому что вы объявили operator << со вторым параметром в качестве неконстантных ссылок

friend ostream& operator<<(ostream&, Vertex &); 
            ^^^^^^^^ 

Вы должны объявить его как

friend ostream& operator<<(ostream&, const Vertex &); 
            ^^^^^ 

В противном случае изменить вышеуказанное заявление к следующему

map<int, vector<Vertex> >::iterator findVertex = vertexMap.find(i); 
          ^^^^^^^^ 

И изменить это заявление

cout<<findVertex->second; //does not work 

в следующем фрагменте кода

for (Vertex &v : findVertex->second) cout << v << endl; 

Если вы измените оператор specyfying спецификатор сопзЬ для второго параметра, то вы можете написать

map<int, vector<Vertex> >::const_iterator findVertex = vertexMap.find(i); 
          ^^^^^^^^^^^^^^ 
//... 

for (const Vertex &v : findVertex->second) cout << v << endl; 
     ^^^^^ 

Или вместо диапазона на основе для заявления вы можете использовать обычный цикл, как, например,

for (std::vector<Vertex>::size_type i = 0; i < findVertex->second.size(); i++) 
{ 
    std::cout << findVertex->second[i] << std::endl; 
} 

или

for (std::vector<Vertex>::iterator it = findVertex->second.begin(); 
     it != findVertex->second.end(); 
     ++it) 
{ 
    std::cout << *it << std::endl; 
} 
+0

Работал для меня. Благодаря! Действительно ценю это. –

+0

@Collin Oladimeji Добро пожаловать. :) –

2

Ваш map имеет тип

map<int, vector<Vertex>> 

Это означает, что first является int и second является vector<Vertex>.

Пока вы определили operator<< для Vertex, для vector<Vertex> таких функций нет.Вы бы итерацию через vector, если у вас есть доступ к C++ 11 вы можете использовать что-то вроде

if(findVertex != vertexMap.end()) 
{ 
    cout << "\nRecord found: "; 
    cout << findVertex->first << '\n'; 
    for (auto const& vertex : findVertex->second) 
    { 
     cout << vertex << '\n'; 
    } 
} 

Если у вас нет доступа к C++ 11 вы можете сделать ту же самую идею вручную

if(findVertex != vertexMap.end()) 
{ 
    cout << "\nRecord found: "; 
    cout << findVertex->first << '\n'; 
    for (vector<Vertex>::const_iterator itVertex = findVertex->second.cbegin(); 
      itVertex != findVertex->second.cend(); 
      ++itVertex) 
    { 
     Vertex const& vertex = *itVertex; 
     cout << vertex << '\n'; 
    } 
} 
+0

Спасибо за это. У меня нет доступа к C++ 11 и используется ручная версия. Тем не менее, мне была представлена ​​эта ошибка: 'error: no match for 'operator =' (типы операндов: 'std :: vector :: iterator {aka __gnu_cxx :: __ normal_iterator > } 'и' std :: vector :: const_iterator {aka __gnu_cxx :: __ normal_iterator >} ') | ' –

+0

@CollinOladimeji Попробуйте отредактированный код сейчас. Я изменил на ':: const_iterator' и использовал' cbegin() 'и' cend() '. – CoryKramer

+0

@Collin Oladimeji См. Мой ответ. :) –

Смежные вопросы