2016-04-12 14 views
1

私は、このコンパイルエラーを取得:マップイテレータ:単項の無効な型引数「*」(「int型」を持っている)

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

私は(*cols_it).first(*cols_it).secondを使用してみましたし、私は考えることができる他のすべての順列ましたが、コンパイルすることはできません。私は何を書いていますか?

は、ここでは、コードの一部です:

#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

ところで、多分あなたはかなりのstd ::フォームのストアのペアよりも設定を使用したい「X - > X」マップで? – bipll

答えて

4

rows.insert(y,y);cols.insert(x,x);が動作しません、std::map::insertは、その引数としてstd::pair<>期待しています。

あなたは可能性:

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

または(C++ 11以降)list initializationを使用します。

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

または代わりに(C++ 11以降)std::map::emplaceを使用します。

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

std::mapを使用しているため、単純な修正は、一般的なコンテナの挿入物:あなたのループカウンタの一部はAの特定の行の代替として、A[0]の特に使用を少し奇妙に見える

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

std::mapのより便利なインデクサと

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

。それは片付けすることができ、あなたはstd::mapよりも簡単にstd::setを使用することができます。

#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

'std :: map :: insert'は、同等のキーを持つelmentがすでに存在するとき、' std :: map :: operator [] 'と異なる動作をすることに注意してください。 – songyuanyao

+0

@songyuanyao - 同意。私の答えは、既存の値を決して変更しないアルゴリズムを利用しています(そして、そのセットはより適切です - 私は編集しました)。 –

関連する問題