类元素加入的 C++ 自动迭代器向量
Posted
技术标签:
【中文标题】类元素加入的 C++ 自动迭代器向量【英文标题】:C++ auto iterator vector of class elements accession 【发布时间】:2019-06-09 17:46:27 【问题描述】:对不起,如果这听起来很愚蠢,我努力了 3 个小时来避免提出愚蠢的问题,我发现了问题所在,但试图更深入地理解它,我没有找到明确的答案,所以我希望各位专家给我一个关于类行为向量及其对象加入的简要“理论”解释。
我注意到如果我定义一个类,例如
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);
;
我把它的对象放在一个向量中:
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
...
但如果我尝试通过类向量循环添加属性,它不会将其插入到地图中:
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
因为它在地图中没有找到这个属性。 但是,如果通过其特定位置访问每个成员,它会起作用:
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 )
等价于for ( Person var : vVarClass )
。如果你想对引用而不是副本进行操作,你应该写for ( auto& var : vVarClass )
。有关auto
究竟是什么的更多信息,请考虑阅读documentation。
【参考方案1】:
您需要在循环中引用。否则,您对副本进行操作,该副本会被销毁。
for ( auto &var : vVarClass )
第二个 .insert 调用也是多余的 - insert 将插入或不插入(仅当键已经存在时),在这两种情况下它都会将迭代器返回到现有的键值。
【讨论】:
【参考方案2】:auto var
将进行复制。 const auto& var
将为您提供只读参考(无副本)。 auto& var
会给你一个可修改的引用(没有副本,会让你就地修改对象)。
还要记住auto
并不特殊。它只是意味着“编译器,请为我找出正确的类型,所以我不必输入它”。最终结果与您手动输入类型名称完全相同。
【讨论】:
【参考方案3】:简答:
自动迭代器是否在制作对象的“副本”[...]
是的。
您可以改用auto&
来避免复制。
【讨论】:
以上是关于类元素加入的 C++ 自动迭代器向量的主要内容,如果未能解决你的问题,请参考以下文章