C++ 在C+;中取消对迭代器的引用时出错+;集合与向量

C++ 在C+;中取消对迭代器的引用时出错+;集合与向量,c++,pointers,vector,iterator,set,C++,Pointers,Vector,Iterator,Set,我正在写这段代码,我得到一个错误: [错误]将“const std::vector”作为“void std::vector::push_back(const value_type&)[with _Tp=metastock7,_Alloc=std::allock,std::vector::value_type=metastock7]”的“this”参数传递将丢弃限定符[-fppermissive] 结构A{ 字符串名; 向量行; }; 集合; 矢量数据//我在代码中填充了向量 std::set::

我正在写这段代码,我得到一个错误:

[错误]将“const std::vector”作为“void std::vector::push_back(const value_type&)[with _Tp=metastock7,_Alloc=std::allock,std::vector::value_type=metastock7]”的“this”参数传递将丢弃限定符[-fppermissive]

结构A{ 字符串名; 向量行; }; 集合; 矢量数据//我在代码中填充了向量 std::set::迭代器; std::配对ret; 对于(int i=0;irows.push_back(mstk7);//也会失败 } 我真的不明白这个错误。你能帮忙吗


谢谢。

std::set
是一个有序容器,因此它不允许您直接修改其元素。如果它这样做了,您可能会使其订购保证失效


要修改元素,您需要复制它,从集合中删除它,修改它,然后重新插入它。如果你发现自己需要经常这样做,你可能想考虑使用不同的容器类型,特别是复制你的<代码> STD::向量成员可能会变得昂贵。

也许使用<代码> map 会更理想,谢谢!我选择set只是因为它不允许重复。还有其他不允许重复的容器吗?正如@OlivierPoulin所说,您最好在
name
行之间建立映射。看看和。@user3665096好吧,有std::unordered_集,但不幸的是,它也不允许修改它的对象,因为它的对象是按哈希值排序的,哈希值通常取决于对象的状态。“无序”就到此为止。如果您不想对设计做太多更改,没有什么可以阻止您使用一个以::名称为键的std::map。只要你不打算在地图上改变一个城市的名字,就可以了
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
}