![](/img/trans.png)
[英]How to modify the value of a key-value Pair from a map while I do not know whether the key is exist in the map?
[英]Error while assigning a pair value to a map key
这是我的代码的摘录:
std::map<int, std::pair< const int, const std::vector<POINT_3d> > > m_srcHitData;
void addHit( const int edgeId, const int hit )
{
m_srcHitData[edgeId] = std::make_pair( hit, std::vector<POINT_3d>() );
}
我不断收到错误:
stl_pair.h(180): error: no operator "=" matches these operands operand types are: const std::vector<POINT_3d, std::allocator<POINT_3d>> = const std::vector<POINT_3d, std::allocator<POINT_3d>> second = __p.second; ^ detected during instantiation of "std::pair<_T1, _T2> &std::pair<_T1, _T2>::operator=(const std::pair<_U1, _U2> &)
这意味着什么? 我尝试了不同的方法,但仍然遇到此错误或类似错误。 谢谢!
好吧, m_srcHitData[edgeId]
是一对带有const
向量成员的对。 您不能简单地分配给它,因为这意味着分配给const
向量,这是不可能的...
至于您可以做什么,请参阅:
如何创建一个常量值的std :: map,它仍然可以由[]运算符访问?
正如@FrancisCugler建议的那样,例如,可以这样写:
m_srcHitData[edgeId].insert( std::make_pair( hit, std::vector<POINT_3d>() );
但是,如果向量很长,您实际上可能并不想复制所有这些数据。
您代码中的这一部分看起来很难看...
std::map<int, std::pair< const int, const std::vector<POINT_3d> > > m_srcHitData;
您可以尝试重组一下代码。
struct Pair {
unsigned int key_;
std::vector<POINT_3d> points_;
Pair() {} // Empty Default
Pair( const unsigned int& key, const std::vector<POINT_3d>& points ) :
key_(key),
points_( points )
{}
};
然后...
std::map<unsigned, Pair> m_srcHitData;
void addHit( const int edgeId, const int hit ) {
m_srcHitData[edgeId] = Pair( hit, std::vector<POINT_3d>() );
}
我做了这个简短的程序来模拟类似的结构,只是我用strings
代替了std::vector<POINT_3d>
#include <string>
#include <iostream>
#include <map>
struct Pair {
unsigned key_;
std::string value_;
Pair() {}
Pair( const unsigned int& key, const std::string& value ) :
key_( key ),
value_( value ) {}
};
class MyClass {
public:
std::map<unsigned, Pair> myMap_;
void addValue( const unsigned int& key, const std::string& value ) {
myMap_[key] = Pair( key, value );
}
};
int main() {
MyClass myClass;
myClass.addValue( 1, "Hello" );
myClass.addValue( 2, "World" );
typedef std::map<unsigned, Pair>::iterator Iter;
Iter it = myClass.myMap_.begin();
for ( ; it != myClass.myMap_.end(); ++it ) {
std::cout << "Key: " << it->first << " Pair-Key: " << it->second.key_ << " Pair-value: " << it->second.value_ << std::endl;
}
std::cout << "\nPress any key and enter to quit." << std::endl;
char c;
std::cin >> c;
}
除了将vector<T>
对象替换为strings
之外,您可以使用上述内容。
为了简化演示,我还在struct
和class
上都使用了公共接口。 通常, class
的容器将通过附件功能被protected
或private
。
编辑这是为了帮助首先构建地图。 启用地图后,可以根据需要对其进行修改以添加const
存储类型,但是使用它们可能会很棘手。 请参阅einpoklum答案中的链接。
如果使用的是较新版本的C ++,则可以更改以下代码行:
typedef std::map<unsigned, Pair>::iterator Iter;
Iter it = myClass.myMap_.begin();
到这个:
auto it = myClass.myMap_.begin();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.