很抱歉,如果这听起来很愚蠢,我努力了 3 个小时以避免提出愚蠢的问题,并且我解决了问题,但试图更深入地理解它,我没有找到明确的答案,所以我希望你们专家给我一个答案关于类行为 vector 及其对象加入的简短“理论”解释。
我注意到,如果我定义一个类,例如
class Variant {
std::map<std::string, std::string> attributes;
public:
void addAttr(std::string attr, std::string value){
if ( !attributes.insert( std::make_pair( attr, value ) ).second ) std::cout << "inserted fail for: " << attr << " (attribute already present)" << '\n';
attributes.insert( std::make_pair( attr, value ) );
}
std::string getValue(std::string attr){ return attributes.at(attr); }
};
我将它的对象放入 vector 中:
std::vector<Variant> vVarClass;
for (int i = 0; i < 10; i++ ) {
Vector tmp;
tmp.addAttr("one", "first");
tmp.addAttr("two", "second");
tmp.addAttr("three", "third");
vVarClass.push_back(tmp);
}
然后我可以轻松访问类对象的属性:
for ( auto var : vVarClass ) {
std::cout << var.getValue("one") << '\n';
}
first
first
...
但是如果我尝试通过类 vector 循环添加属性,它不会将其插入到 map 中:
for ( auto var : vVarClass ) {
var.addAttr("four", "fourth");
}
没有错误,但是:
for ( auto var : vVarClass ) {
var.getValue("four");
}
terminate called after throwing an instance of 'std::out_of_range'
what(): map::at
Aborted
因为它在 map 中找不到此属性。 但是,如果通过特定位置访问每个成员,则它可以工作:
for ( int i = 0; i < vVarClass.size(); i++ ) {
vVarClass[i].addAttr("four", "fourth");
}
for ( auto var : vVarClass ) {
var.getValue("four");
}
fourth
fourth
...
自动迭代器是否制作对象的“拷贝”,将属性插入到该对象中而不是原始对象中?
提前非常感谢您的帮助!
最佳答案
您的循环中需要引用。否则,您对拷贝进行操作,该拷贝会被破坏。
for ( auto &var : vVarClass )
第二个 .insert 调用也是多余的 - insert 要么插入,要么不插入(仅当键已经存在时),在这两种情况下,它都会将迭代器返回到现有的键值。
关于C++ 类元素加入的自动迭代器 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56517006/