2016-04-12 15 views
1

Bu derleme hatası alıyorum: Ben (*cols_it).first ve (*cols_it).second ve aklıma gelen her permütasyon kullanarak denedimharitası yineleyici: tekli geçersiz tip argüman '*' (var 'int')

error: invalid type argument of unary ' * ' (have ' int ')
_M_insert_unique_(end(), *__first);

, ama derlemeyi başaramam. Ne yazmalıyım?

İşte kod bazıları aşağıda verilmiştir:

#include <map> 
#include <vector> 

using std::map; 
using std::vector;  

void setZeroes(vector<vector<int> > &A) { 
    map<int,int> rows; 
    map<int,int> cols; 
    for (unsigned int x = 0; x < A[0].size(); x++) { 
     for (unsigned int y = 0; y < A.size(); y++) { 
      if (A[x][y] == 0) { 
       rows.insert(y,y); // error reported here 
       cols.insert(x,x); 
      } 
     } 
    } 
    map<int,int>::iterator rows_it = rows.begin(); 
    map<int,int>::iterator cols_it = cols.begin(); 
    while (rows_it != rows.end()) { 
     for (unsigned int i = 0; i < A[0].size(); i++) { 
      int val = rows_it->second; 
      A[val][i] = 0; 
     } 
     rows_it++; 
    } 
    while (cols_it != cols.end()) { 
     for (unsigned int i = 0; i < A.size(); i++) { 
      int val = cols_it->second; 
      A[i][val] = 0; 
     } 
     cols_it++; 
    } 
} 
+0

BTW, belki daha ziyade std :: formunun mağaza çiftleri daha set kullanmayı tercih ediyorum "x -> x", haritadaki? – bipll

cevap

4

rows.insert(y,y); ve cols.insert(x,x); çalışmaz, std::map::insert onun argüman olarak std::pair<> bekliyor.

Yapabilirsin:

rows.insert(std::make_pair(y,y)); 
cols.insert(std::make_pair(x,x)); 

veya list initialization (11 C++ beri) kullanın:

rows.insert({y,y}); 
cols.insert({x,x}); 

ya da (C++ 11 beri) std::map::emplace kullanmak yerine:

rows.emplace(y,y); 
cols.emplace(x,x); 
0

Basit düzeltme, std::map kullanıyorsunuz, genel kapsayıcı ek yerini değiştirmek için : En döngü sayaçları bazıları A belirli bir sıranın yerine, A[0] özellikle kullanımını biraz tuhaf bakmak

  rows[y] = y; 
      cols[x] = x; 

: std::map daha rahat dizinleyicideki ile

  rows.insert(y,y); 
      cols.insert(x,x); 

. Yani tidied olabilir ve siz std::map daha kolay std::set kullanabilirsiniz:

#include <set> 
#include <vector> 

void setZeroes(std::vector<std::vector<int> > &A) { 
    std::set<unsigned int> rows, cols; 

    for (unsigned int x = 0; x < A.size(); x++) { 
     for (unsigned int y = 0; y < A[x].size(); y++) { 
      if (A[x][y] == 0) { 
       rows.insert(y); 
       cols.insert(x); 
      } 
     } 
    } 

    for (auto r: rows) { 
     for (unsigned int i = 0; i < A[r].size(); i++) { 
      A[r][i] = 0; 
     } 
    } 

    for (auto c: cols) { 
     for (unsigned int i = 0; i < A.size(); i++) { 
      A[i][c] = 0; // DANGER: should check c < A[i].size() 
     } 
    } 
} 
+1

Not: std :: map :: insert ', zaten eşdeğer bir anahtarla bir seçim olduğunda std :: map :: operator [] 'ile farklı davranışlara sahip olduğunu unutmayın. – songyuanyao

+0

@songyuanyao - Anlaşmalı; Benim cevabım, mevcut bir değeri asla değiştirmeyen (ve bir kümenin daha uygun olduğu - düzenlediğim) algoritmadan faydalanıyor. –

İlgili konular