首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么vector::erase不能在具有const的类元素上工作

vector::erase函数用于删除vector容器中的元素。然而,该函数不能直接在具有const限定的类元素上操作,原因是const限定的元素是不可修改的。

在C++中,const关键字用于指定常量,即该变量的值在初始化后不能被修改。对于具有const限定的类元素,其成员变量和成员函数在对象创建后不可改变,因此不能通过erase函数来删除这些元素。

如果需要删除具有const限定的类元素,可以采用其他方法,例如使用迭代器遍历容器并找到需要删除的元素,然后使用erase函数删除元素。

以下是一个示例代码:

代码语言:txt
复制
#include <iostream>
#include <vector>

class MyClass {
public:
    MyClass(int val) : m_val(val) {}
    int getValue() const { return m_val; }

private:
    int m_val;
};

int main() {
    std::vector<MyClass> vec;
    vec.emplace_back(1);
    vec.emplace_back(2);
    vec.emplace_back(3);

    int target = 2;
    for (auto it = vec.begin(); it != vec.end(); ) {
        if (it->getValue() == target) {
            it = vec.erase(it);
        } else {
            ++it;
        }
    }

    for (const auto& elem : vec) {
        std::cout << elem.getValue() << " ";
    }
    std::cout << std::endl;

    return 0;
}

上述代码创建了一个自定义类MyClass的vector容器,其中每个元素都有一个int类型的值。然后,我们使用迭代器遍历容器,找到需要删除的元素并使用erase函数删除。最后,我们输出剩下的元素值。

这里并没有提及任何特定的云计算品牌商产品,因为问题与云计算领域无关。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 万字解析:vector类

    // 测试vector的默认扩容机制 void TestVectorExpand() { size_t sz; vector<int> v; sz = v.capacity(); cout << "making v grow:\n"; for (int i = 0; i < 100; ++i) { v.push_back(i); if (sz != v.capacity()) { sz = v.capacity(); cout << "capacity changed: " << sz << '\n'; } } } //vs:运行结果:vs下使用的STL基本是按照1.5倍方式扩容 making foo grow: capacity changed: 1 capacity changed: 2 capacity changed: 3 capacity changed: 4 capacity changed: 6 capacity changed: 9 capacity changed: 13 capacity changed: 19 capacity changed: 28 capacity changed: 42 capacity changed: 63 capacity changed: 94 capacity changed: 141 //g++运行结果:linux下使用的STL基本是按照2倍方式扩容 making foo grow: capacity changed: 1 capacity changed: 2 capacity changed: 4 capacity changed: 8 capacity changed: 16 capacity changed: 32 capacity changed: 64 capacity changed: 128 // 如果已经确定vector中要存储元素大概个数,可以提前将空间设置足够 // 就可以避免边插入边扩容导致效率低下的问题了 void TestVectorExpandOP() { vector<int> v; size_t sz = v.capacity(); v.reserve(100); // 提前将容量设置好,可以避免一遍插入一遍扩容 cout << "making bar grow:\n"; for (int i = 0; i < 100; ++i) { v.push_back(i); if (sz != v.capacity()) { sz = v.capacity(); cout << "capacity changed: " << sz << '\n'; } } }

    02

    STL小结

    STL就是Standard Template Library,标准模板库。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list, vector,set,map等,STL也是算法和其它一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。是C++标准库的一个重要组成部分,它由Stepanov and Lee等人最先开发,它是与C++几乎同时开始开发的;一开始STL选择了Ada作为实现语言,但Ada有点不争气,最后他们选择了C++,C++中已经有了模板。STL又被添加进了C++库。1996年,惠普公司又免费公开了STL,为STL的推广做了很大的贡献。STL提供了类型安全、高效而易用特性的STL无疑是最值得C++程序员骄傲的部分。每一个C++程序员都应该好好学习STL。大体上包括container(容器)、algorithm(算法)和iterator(迭代器),容器和算法通过迭代器可以进行无缝连接。

    01

    【C++深度探索】map与set的基础介绍与实用指南

    我们之前已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。   而今天我们学习的map、set、multimap、multiset是关联式容器,关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。   根据应用场景的不同,STL总共实现了两种不同结构的关联式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面依次介绍每一个容器。

    01
    领券