【问题标题】:Error dereferencing an iterator in C++ Set and Vector在 C++ Set 和 Vector 中取消引用迭代器时出错
【发布时间】:2015-09-21 10:56:46
【问题描述】:

我正在编写此代码,但出现此错误:

[错误] 将 'const std::vector' 作为 'void std::vector<_tp _alloc>::push_back(const value_type&) 的 'this' 参数传递 [with _Tp = metastock7, _Alloc = std::allocator , std::vector<_tp _alloc>::value_type = metastock7]' 丢弃限定符 [-fpermissive]

struct A{
     string name;
     vector<B> rows;
};
set<A, classcomp> set;
vector<B> data; //I filled the vector in my code
std::set<A, classcomp>::iterator it;
std::pair<std::set<A, classcomp>::iterator,bool> ret;
for(int i = 0; i < data.size(); i++){
    A a;
    B b = data[i];
    a.name= b.name;
    ret = set.insert(a);
    it = ret.first;
    (*it).rows.push_back(b); //IT COMPILES WITHOUT
    // it->rows.push_back(mstk7); //fails as well
}

我真的不明白这个错误。你能帮忙吗?

谢谢。

【问题讨论】:

    标签: c++ pointers vector iterator set


    【解决方案1】:

    std::set 是一个有序的容器,所以它不允许你直接修改它的元素。如果是这样,您可能会使其订购保证无效。

    要修改元素,您需要复制它,从集合中删除它,修改它,然后重新插入它。如果您发现自己需要经常这样做,您可能需要考虑使用不同的容器类型,尤其是复制您的 std::vector 成员可能会很昂贵。

    【讨论】:

    • 也许使用map 会更理想
    • 谢谢!我选择 set 只是因为它不允许重复。还有其他不允许重复的容器吗?
    • 正如@OlivierPoulin 所说,使用namerows 之间的地图可能会更好。看看std::mapstd::unordered_map
    • @user3665096 好吧,有std::unordered_set,但不幸的是它也不允许修改它的对象,因为它的对象是按它们的哈希值排序的,这通常取决于对象的状态.这么多“无序”。
    • 如果你不想改变你的设计,没有什么能阻止你拥有一个以 A::name 为键的 std::map<:string a> 。只要你不打算通过地图改变A的名字,应该没问题
    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多