我知道当我们在STL地图中插入值时,会制作并存储一份副本.我有代码基本上在地图上查找并获得迭代器.
然后我打算使用迭代器来更改地图中的值.结果不是我所期望的那样:当从程序的另一部分访问时,值不会改变.我怀疑它是因为我申请的更改是一份价值副本.相关代码如下.
ObjectMappingType::iterator it = objectMapping_.find(symbol);
if (it == objectMapping_.end()) {
throw std::invalid_argument("Unknown symbol: " + symbol);
}
get<3>(it->second) = value;
Run Code Online (Sandbox Code Playgroud)
注意:我实际上是在尝试更改boost :: tuple中的值,该值存储为地图的"值"部分.
嗯......这两种方法对我来说似乎都很好.这是我使用的整个示例:
#include <iostream>
#include <map>
#include <string>
#include <boost/tuple/tuple.hpp>
typedef boost::tuple<int, std::string> value_type;
typedef std::map<int, value_type> map_type;
std::ostream&
operator<<(std::ostream& os, value_type const& v) {
os << " number " << boost::get<0>(v)
<< " string " << boost::get<1>(v);
return os;
}
int
main() {
map_type m;
m[0] = value_type(0, "zero");
m[1] = value_type(0, "one");
m[2] = value_type(0, "two");
std::cout
<< "m[0] " << m[0] << "\n"
<< "m[1] " << m[1] << "\n"
<< "m[2] " << m[2] << "\n"
<< std::endl;
boost::get<0>(m[1]) = 1;
map_type::iterator iter = m.find(2);
boost::get<0>(iter->second) = 2;
std::cout
<< "m[0] " << m[0] << "\n"
<< "m[1] " << m[1] << "\n"
<< "m[2] " << m[2] << "\n"
<< std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出正是我所期望的.
lorien$ g++ -I/opt/include -gdwarf-2 foo.cpp
lorien$ ./a.out
m[0] number 0 string zero
m[1] number 0 string one
m[2] number 0 string two
m[0] number 0 string zero
m[1] number 1 string one
m[2] number 2 string two
lorien$
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9125 次 |
| 最近记录: |