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

标签 c++ function class attributes

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

相关文章:

javascript - 如何为 Angular 应用程序组织类(class)?

c++ - 在 C++ 中使用所有默认参数调用函数时使用参数名称

c++ - lambda C++ 的类型转换

oop - Lua类继承问题

javascript - 检查 div 是否存在,如果不存在 - 再次检查直到它被创建

java - 如何在Java 8中传递多个参数和一个函数,然后执行带参数的函数?

javascript - 如何使用 jquery 将与类名相关的样式添加到元素?

c++:用随机字节填充缓冲区的最快方法

c++ - 删除 vector 中的对象

c++ - Opencv 图像包装器 cpp