类元素加入的 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&amp; var : vVarClass )。有关auto 究竟是什么的更多信息,请考虑阅读documentation。 【参考方案1】:

您需要在循环中引用。否则,您对副本进行操作,该副本会被销毁。

for ( auto &var : vVarClass )

第二个 .insert 调用也是多余的 - insert 将插入或不插入(仅当键已经存在时),在这两种情况下它都会将迭代器返回到现有的键值。

【讨论】:

【参考方案2】:

auto var 将进行复制。 const auto&amp; var 将为您提供只读参考(无副本)。 auto&amp; var 会给你一个可修改的引用(没有副本,会让你就地修改对象)。

还要记住auto 并不特殊。它只是意味着“编译器,请为我找出正确的类型,所以我不必输入它”。最终结果与您手动输入类型名称​​完全相同

【讨论】:

【参考方案3】:

简答:

自动迭代器是否在制作对象的“副本”[...]

是的。

您可以改用auto&amp; 来避免复制。

【讨论】:

以上是关于类元素加入的 C++ 自动迭代器向量的主要内容,如果未能解决你的问题,请参考以下文章

使用迭代器查找向量的中间元素 - C++

c++迭代器在迭代向量时崩溃

C++中的向量迭代器

对于 C++ Random Access Iterator(向量迭代器),迭代器之间的差异是如何计算的?

c++为自定义矩阵类实现迭代器

在 C++ 中为我自己的自定义向量模板类实现迭代器(类似于 STL)[重复]