次のコード持つ:C++:STL:セット:記憶値const性
#include <iostream>
#include <set>
#include <string>
#include <functional>
using namespace std;
class Employee {
// ...
int _id;
string _name;
string _title;
public:
Employee(int id): _id(id) {}
string const &name() const { return _name; }
void setName(string const &newName) { _name = newName; }
string const &title() const { return _title; }
void setTitle(string const &newTitle) { _title = newTitle; }
int id() const { return _id; }
};
struct compEmployeesByID: public binary_function<Employee, Employee, bool> {
bool operator()(Employee const &lhs, Employee const &rhs) {
return lhs.id() < rhs.id();
}
};
int wmain() {
Employee emplArr[] = {0, 1, 2, 3, 4};
set<Employee, compEmployeesByID> employees(emplArr, emplArr + sizeof emplArr/sizeof emplArr[0]);
// ...
set<Employee, compEmployeesByID>::iterator iter = employees.find(2);
if (iter != employees.end())
iter->setTitle("Supervisor");
return 0;
}
を私は(MSVCPP 11.0)を有する、このコードをコンパイルすることができない。
1> main.cpp
1>d:\docs\programming\test01\test01\main.cpp(40): error C2662: 'Employee::setTitle' : cannot convert 'this' pointer from 'const Employee' to 'Employee &'
1> Conversion loses qualifiers
これはコンパイルするのに役立つ:
if (iter != employees.end())
const_cast<Employee &>(*iter).setTitle("Supervisor");
質問:私はmap
とmultimap
の値がpair(const K, V)
ここで、Kはキー、Vは値です。 Kオブジェクトは変更できません。しかし、set<T>
とmultiset<T>
は、const T
ではなく、オブジェクトをT
として保存します。だから私はなぜこの義経が必要なのですか?
実際、私は '' set''は値を変更できないように(効果的に '' const''として)保存していると思います。値を変更すると、アイテムがセット内の間違った場所にある可能性があるため、アイテムの変更を許可することは意味がありません。 –
'std :: unary_function'は2011年に廃止されましたが、とにかくファンクタをラムダに置き換えることができます。 – pmr
これは間違った方法で 'set'を使っているという警告です。あなたのレコードはキーと値を持っていますが、 'map'ではなく' set'でそれらを保存しています。 – Omnifarious