gpt4 book ai didi

类元素加入的 C++ 自动迭代器 vector

转载 作者:搜寻专家 更新时间:2023-10-31 00:25:15 25 4
gpt4 key购买 nike

如果这听起来很愚蠢,我很抱歉,我努力了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com