解除引用迭代器(c ++)

时间:2014-05-31 20:27:30

标签: c++ stl

我在解除引用返回非指针值的操作结果时遇到问题。

在这张地图中,我有指向矩阵的指针

map<string, GeneralMatrix*> matrixes;

这就是矩阵运算的样子

GeneralMatrix & add(const GeneralMatrix & m2) {
        //Check for compatible matrixes
        if (height != m2.height || width != m2.width) {
            cout << "Matrix sizes must match!" << endl;
            return *this;
        }
        //Create new empty matrix
        GeneralMatrix &m3 = createNew(width, m2.height);
        //Set every number to sum of this and given matrix
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < m2.width; j++) {
                double val = m2.get(i, j);
                if (val != 0) {
                    val += get(i, j);
                    m3.set(i, j, val);
                }
            }
        }
        return m3;
    }

如您所见,add方法返回我想插入地图的非指针矩阵。

这就是我的尝试:

map<string, GeneralMatrix *>::iterator itop1 , itop2;
//now seting iterators to their position

//there is the problem
matrixes.insert(pair<string, GeneralMatrix *>(result, (*itop1->second->add(*itop2->second)))); 

问题是我无法找到如何插入对的第二个参数。由于类型不同,它总是以错误结束。

尝试n1:

itop1->second->add(itop2->second)

添加方法需要指针

尝试n2:

itop1->second->add(*itop2->second)

结果是非指针,需要是指针

尝试n3:

(*itop1->second->add(*itop2->second))

main.cpp:611:68:错误:'operator *'不匹配(操作数类型为'GeneralMatrix')

如何去除结果?

2 个答案:

答案 0 :(得分:2)

理想情况下,您可以将matrixes更改为map<string, GeneralMatrix>

或者,您可以保留一个存储矩阵的std::list<GeneralMatrix>,并指定列表中的矩阵。

裸指针被认为是不好的风格。指针应该告诉他们对项目的所有权状态,例如unique_ptrshared_ptrweak_ptr。这也将照顾内存管理。

如果你的班级表现良好且地图拥有指针,你可以这样做:

matrixes.insert(std::make_pair(std::string("name"), new GeneralMatrix(std::move(m)));

m是您尝试移动到地图中的矩阵。

如果地图中的指针不拥有指针,您只需使用&m插入地图的地址,但这需要您将矩阵存储在某个持久性位置,例如上面显示的list

编辑: 迭代器的具体问题可以这样解决:

matrixes.insert(pair<string, GeneralMatrix *>(result, &(*itop1)));

答案 1 :(得分:1)

快速解决您的问题的方法是:

GeneralMatrix& m3= add(m2);
matrixes["string"] = &m3;
matrixes.insert(std::make_pair(std::string("name"), (&m3)));
matrixes.insert(std::make_pair<std::string, GeneralMatrix*>("name", &m3));

在这种情况下它们基本上都是等价的,但是operator []将始终在地图中插入一个值,即使右手操作符为空。 例如:

matrixes["s"]; 

将插入一个空指针

但是您的代码有几个问题:

首先,为什么需要从createNew方法返回引用? 只需将值返回到新矩阵即可。你没有做任何事情。

GeneralMatrix createNew(width, m2.height);

正如另一个答案中所建议的那样,将字符串映射到unique_pointers而不是使用原始指针和/或杠杆移动语义。 在你的情况下,由于“添加”操作总是会导致创建一个新的矩阵,我甚至不打扰处理指针,因为它们没有给你带来真正的好处

在这里,您可以找到一些符合您需求的精简代码:

std::map<std::string, GeneralMatrix> matrixes;

GeneralMatrix add(const GeneralMatrix& m2)
{
    //Create new empty matrix
    auto m3 = createNew(width, m2.height);
    return m3;
}

另请注意,此代码将通过编译进行优化,使用名为NRVO(命名为return valueoptimization)的东西,并且它可能比您之前在createNew方法中处理动态分配的代码更快。 现在,如果通用矩阵正确实现了右值复制构造函数,则可以将其移动到地图

map.insert(std::string("string"), std::move<m3>);

或者你可以放置它(尚未由所有编译器实现)

map.emplace(std::make_pair(std::string("string"), createNew(m2)));

如果您需要多态性,只需使用返回基本std :: unique_ptr的工厂方法。

std::unique_ptr<GeneralMatrix> createNew(width, m2.height);