【问题标题】:map iterator: invalid type argument of unary '*' (have 'int')映射迭代器:一元'*'的无效类型参数(有'int')
【发布时间】:2016-04-12 05:31:46
【问题描述】:

我得到这个编译错误:

错误:一元“*”的类型参数无效(有“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++;
    }
}

【问题讨论】:

  • 顺便说一句,也许您宁愿使用 std::set 而不是在地图中存储成对的“x -> x”?

标签: c++ dictionary iterator


【解决方案1】:

rows.insert(y,y);cols.insert(x,x); 不起作用,std::map::insert 期望 std::pair&lt;&gt; 作为其参数。

你可以:

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

或使用list initialization(C++11 起):

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

或改用std::map::emplace(C++11 起):

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

【讨论】:

    【解决方案2】:

    由于您使用的是std::map,因此简单的解决方法是替换通用容器插入:

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

    使用更方便的索引器std::map:

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

    您的一些循环计数器看起来有点奇怪,尤其是使用A[0] 代替A 的特定行。这可以整理一下,你可以使用std::setstd::map 更容易:

    #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()
            }
        }
    }
    

    【讨论】:

    • 请注意,当已经存在具有等效键的元素时,std::map::insertstd::map::operator[] 的行为不同。
    • @songyuanyao - 同意;我的答案是利用算法永远不会改变现有值(并且更适合一组 - 我已经编辑过)。
    猜你喜欢
    • 2021-10-15
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多