C++ —— vector容器

C++知识总结目录索引

一、创建容器

vector()                     // 创建一个空vector
vector(int nSize)            // 创建一个vector,元素个数为nSize
vector(int nSize,const t& t) // 创建一个vector,元素个数为nSize,且值均为t
vector(const vector&)        // 拷贝构造函数
vector(begin,end)            // 复制另一个数组[begin,end)区间内的元素到vector中

二、vector实现二维数组

1. 定义二维数组

  1. 利用push_back()
int main()
{
    vector<vector<int>> v;

    vector<int> a;
    a.push_back(1);
    a.push_back(2);

    vector<int> b;
    b.push_back(3);
    b.push_back(4);

    v.push_back(a);
    v.push_back(b);

    return 0;
}
  1. 直接定义一个二维数组
//定义一个5行3列的数组
int main()
{
    int i = 0;
    int j = 0;
    vector<vector<int>> array(5);
    for (i = 0; i < array.size(); i++)
        array[i].resize(3);

    return 0;
}

2. 遍历二维数组

  1. 使用迭代器
void ergodic_with_iterator(vector<vector<int>> v)
{
    if (v.empty())
        return;

    vector<vector<int>>::iterator iter;
    vector<int>::iterator it;
    vector<int> tmp;

    for (iter = v.begin(); iter != v.end(); ++iter)
    {
        tmp = *iter;
        for (it = tmp.begin(); it != tmp.end(); it++)
            cout << *it << " ";
    }
}
  1. 使用下标
void ergodic_with_index(vector<vector<int>> v)
{
    if (v.empty())
        return;

    for (int i = 0; i < v.size(); i++)
    {
        for (int j = 0; j < v[0].size(); j++)
            cout << v[i][j] << " ";
    }
}

三、重点接口介绍

1. resize()

void resize (size_type n, value_type val = value_type());

调整数组的容量,接受两个参数。
1. 如果 n < v.size(),则将其元素个数减少到n个,销毁后面那些超出的元素。
2. 如果 v.size() < n < v.capacity(),扩大size(),新增的元素值为val。
3. 如果 n > v.capacity(),对数组进行扩容,新增的元素值为val。


2. reserve()

void reserve (size_type n);
扩大数组容量,如果n > v.capacity(),给数组新开辟一块容量为n的空间,把原数据拷贝至新空间;如果n<=v.capacity(),则不进行任何操作。


3. operator[]

reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

  返回数组中下标为n的元素的引用。该函数有两种形式,普通的可以通过返回值修改v[n]的值,加const不能通过返回值修改。如果n超出数组范围,直接断言报错。与它类似的还有at()函数,该函数出现越界情况是抛出异常。


4. assign()

(1) void assign(const_iterator first,const_iterator last);
(2) void assign(size_type n,const T& x = T());

(1) 将区间[first,last)的元素赋值到当前的vector容器中
(2) 赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。

vector<int> first;
vector<int> second;
vector<int> third;

first.assign(7, 100);             // 7 ints with a value of 100

vector<int>::iterator it;
it = first.begin() + 1;

second.assign(it, first.end() - 1); // the 5 central values of first

int myints[] = { 1776, 7, 4 };
third.assign(myints, myints + 3);   // assigning from array.

这里写图片描述


5. insert()

(1) iterator insert (iterator position, const value_type& val);

(2) void insert (iterator position, size_type n, const value_type& val);

(3) template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);

(1) 在指定位置position前插入值为val的元素,返回指向这个元素的迭代器
(2) 在指定位置position前插入n个值为val的元素
(3)在指定位置position前插入区间[first, last)的所有元素

int main()
{
    vector<int> v1(3, 100);
    vector<int>::iterator it;

    //(1)
    it = v1.begin();
    it = v1.insert(it, 200);
    //(2)
    v1.insert(it, 2, 300);

    // "it" no longer valid, get a new one:
    it = v1.begin();

    //(3)
    vector<int> v2(2, 400);
    v1.insert(it + 2, v2.begin(), v2.end());

    int myarray[] = { 501, 502, 503 };
    v1.insert(v1.begin(), myarray, myarray + 3);

    cout << "v1 contains:";
    for (it = v1.begin(); it<v1.end(); it++)
        cout << ' ' << *it;
    cout << endl;

    return 0;
}

这里写图片描述


6. erase()

(1) iterator erase (iterator position);
(2) iterator erase (iterator first, iterator last);

(1) 删除position处的元素。迭代器position指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素

(2) 删除区间[first, last)内的所有元素。删除一段段元素之后,后面的元素(从last开始到vector.end())会被复制到被删除元素段开始的地方(first开始),而vector.end()也根据删除的元素个数往前移动。

注意:即使容器内容是指针对象,erase()也会清空指针对象指向的内容。


7. clear()

  清空容器中的内容,但如果是指针对象的话,并不能清空其内容,必须要像以下方法一样才能达到清空指针对象的内容:

vector<int*> v;
for (int it = 0; it != v.size(); ++it)
{
    delete v[it];
}
v.clear();

但也可以使用swap函数巧妙的完成清理内存:

v.clear();  
v.swap(vector<int>());  

四、其他接口简介

  1. reference at(int pos);返回pos位置元素的引用
  2. reference front();返回首元素的引用
  3. reference back();返回尾元素的引用
  4. iterator begin();返回向量头指针,指向第一个元素
  5. iterator end();返回向量尾指针,指向向量最后一个元素的下一个位置
  6. reverse_iterator rbegin();反向迭代器,指向最后一个元素
  7. reverse_iterator rend();反向迭代器,指向第一个元素之前的位置
  8. bool empty() const;判断向量是否为空,若为空,则向量中无元素
  9. int size() const;返回向量中元素的个数
  10. int capacity() const;返回当前向量张红所能容纳的最大元素值
  11. int max_size() const;返回最大可允许的vector元素数量值
  12. void swap(vector&);交换两个同类型向量的数据
### C++ 中删除 `std::vector` 容器元素的方法 在 C++ 编程语言中,`std::vector` 提供了多种方法来删除其中的元素。以下是几种常见的操作方式及其对应的代码示例。 #### 使用 `pop_back()` 删除末尾元素 如果只需要移除 `std::vector` 的最后一个元素,则可以直接调用 `pop_back()` 函数。此函数不返回被删除的元素值,并且只会影响容器的大小而不改变其容量[^1]。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3}; // 删除末尾元素前 for (const auto& elem : vec) { std::cout << elem << " "; } std::cout << "\n"; vec.pop_back(); // 移除最后一位 // 删除末尾元素后 for (const auto& elem : vec) { std::cout << elem << " "; } return 0; } ``` #### 使用 `erase()` 删除指定位置或范围内的元素 当需要更灵活地控制哪些元素应该被移除时,可以使用 `erase()` 方法。它可以接受单个迭代器或者一对表示区间的迭代器作为参数[^4]。 ##### 单一元素删除 通过传递一个指向目标元素的迭代器给 `erase()` 来实现特定位置上的元素清除: ```cpp #include <iostream> #include <vector> void printVector(const std::vector<int>& v){ for(auto num:v){ std::cout<<num<<" "; } std::cout<<"\n"; } int main(){ std::vector<int> myVec={10,20,30,40}; printVector(myVec); // 假设要删除第二个元素即数值为20的那个 if(!myVec.empty()){ auto it=myVec.begin()+1; // 这里假设索引从零开始计数 myVec.erase(it); printVector(myVec); } return 0; } ``` ##### 范围内元素批量删除 同样也可以利用两个边界迭代器之间形成的半开区间来进行连续多个项目的剔除工作: ```cpp // 继续上面的例子... if (!myVec.empty()) { auto firstIt = myVec.begin(); auto lastIt = myVec.end()-1; myVec.erase(firstIt,lastIt); printVector(myVec); } ``` 以上展示了如何分别针对单独项目以及整段数据序列实施消除动作的过程说明文档[^4]. #### 清空整个 Vector 对于希望一次性全部清空的情况而言,最简便的方式莫过于运用内置成员函数 `clear()` 。这将会把所有的现存条目都予以销毁掉,使得 size 成为了零的同时保留原有的 capacity 大小不变直到再次新增为止[^4]: ```cpp myVec.clear(); printVector(myVec); // Output should be empty now. ``` --- ### 总结 综上所述,在实际开发过程中可以根据具体需求选用不同的手段完成对标准库所提供的动态数组类型——`std::vector` 内部存储项的操作管理任务。无论是简单粗暴式的整体丢弃还是精确细致定位后的局部调整均能找到合适的解决方案加以应对处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值