C++中vector容器简述

本文详细介绍C++中的Vector容器,包括基本操作如创建、插入、访问等,并提供了使用结构体作为元素的例子,还介绍了如何利用算法进行排序和反转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www.cnblogs.com/wang7/archive/2012/04/27/2474138.html

在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。

1 基本操作

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
    cout<<*it<<endl;

(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(8)向量大小:vec.size();

(9)清空:vec.clear();

2

vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码:

复制代码
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;

typedef struct rect
{
    int id;
    int length;
    int width;

  //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。
  bool operator< (const rect &a)  const
    {
        if(id!=a.id)
            return id<a.id;
        else
        {
            if(length!=a.length)
                return length<a.length;
            else
                return width<a.width;
        }
    } }Rect;
int main() { vector<Rect> vec; Rect rect; rect.id=1; rect.length=2; rect.width=3; vec.push_back(rect); vector<Rect>::iterator it=vec.begin(); cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl; return 0; }
复制代码

 3  算法

(1) 使用reverse将元素翻转:需要头文件#include<algorithm>

reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,

一般后一个都不包含.)

(2)使用sort排序:需要头文件#include<algorithm>,

sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

可以通过重写排序比较函数按照降序比较,如下:

定义排序比较函数:

bool Comp(const int &a,const int &b)
{
    return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。

<think>嗯,用户想了解C++中的auto关键字的用法和自动型推导的原理。首先,我需要回忆一下auto在C++中的发展历程。记得C++98里auto是用来声明自动存储期的变量,但后来因为默认就是自动的,所以几乎没人用。到了C++11,auto被重新定义为型推导的关键字,这应该是一个重要的变化。 接下来,用户可能想知道基本用法,比如如何用auto声明变量。根据引用中的例子,比如auto x = 5;会自动推导为int,auto y=3.14是double。还有在迭代器和范围for循环中的应用,比如auto it = v.begin(); 这样写起来更方便,不需要写冗长的型名。 然后,自动型推导的工作原理。需要解释编译器是如何根据初始化表达式来推导型的。可能涉及到模板型推导的规则,因为auto的推导规则和模板参数推导似。比如,auto会去掉引用和const限定符,除非用auto&或者const auto来修饰。 还要提到auto的优点,比如简化代码,避免冗长的型声明,特别是在模板和容器迭代的时候。同时,也要注意使用限制,比如不能用于函数参数(C++20之前),不能用于非静态成员变量等。 另外,用户可能想知道C++11之后的版本对auto的增强,比如C++14中auto可以用于函数返回型推导,C++17中的结构化绑定,以及C++20的lambda表达式参数中使用auto。这些扩展了auto的应用场景。 需要确保回答结构清晰,分点说明,并且结合引用中的例子。还要注意LaTeX格式的正确使用,比如变量用$...$,独立公式用$$...$$,但在这个问题中可能数学公式不多,主要是代码示例。最后生成相关问题,帮助用户进一步学习。 可能的问题点:确保引用的正确性,比如引用1提到auto在迭代器和范围for循环中的使用,引用2和3解释了基本用法和推导规则。要正确标注引用标记,例如在提到范围for循环时添加[^1],在基本用法时引用[^2]和[^3]。 还要检查是否有遗漏的重要点,比如推导规则中的细节,比如当使用auto&时会保留引用和const,而auto本身会去除。比如const auto&的情况。这些都需要在回答中明确说明,避免用户误解。 最后,生成的相关问题要围绕auto关键字的深入应用、不同版本的新特性、使用中的常见错误或限制等,帮助用户扩展知识。</think>### C++ auto关键字用法及自动型推导解析 #### 一、基本用法 1. **变量声明** `auto`关键字通过初始化表达式自动推导变量型: ```cpp auto x = 5; // 推导为int[^2] auto y = 3.14; // 推导为double auto z = "hello"; // 推导为const char* ``` 2. **迭代器与范围for循环** 简化容器遍历和迭代器声明: ```cpp vector<int> v; auto it = v.begin(); // 推导为vector<int>::iterator[^1] for (auto& x : v) { // 推导为int&[^1] // 操作x } ``` 3. **函数返回型推导(C++14+)** 允许函数返回型使用`auto`: ```cpp auto add(int a, int b) { return a + b; // 推导返回型为int } ``` --- #### 二、自动型推导原理 1. **推导规则** 编译器根据初始化表达式的**静态型**推导`auto`型,规则与模板参数推导一致[^3]。 - **值型推导**:`auto`会移除引用和顶层`const`: ```cpp const int a = 10; auto b = a; // b的型是int(移除const) ``` - **引用型推导**:使用`auto&`或`const auto&`保留引用和限定符: ```cpp int x = 5; auto& ref = x; // ref的型是int& const auto& cref = x; // cref的型是const int& ``` 2. **推导示例** | 表达式 | 推导结果 | 说明 | |---------------------|---------------|--------------------------| | `auto a = {1,2,3};` | `std::initializer_list<int>` | 列表初始化 | | `auto* p = &x;` | `int*` | 显式指针型推导 | --- #### 三、核心优势 1. **代码简化** - 避免冗长型声明(如迭代器`vector<int>::iterator`)。 - 支持泛型编程,例如: ```cpp template<typename T, typename U> auto multiply(T a, U b) -> decltype(a*b) { return a * b; // 自动推导返回值型 } ``` 2. **型安全** 编译期完成型检查,避免隐式转换错误。 --- #### 四、使用限制 1. **禁止场景** - 非静态成员变量(C++11~C++17禁止,C++20部分支持静态成员)。 - 函数参数(C++20前不可用)。 - 数组型推导(需配合`decltype`或模板)。 2. **特殊案例** ```cpp auto arr[] = {1, 2, 3}; // 错误:数组必须显式指定型 ``` --- #### 五、标准演进 1. **C++14** 支持函数返回型推导和泛型Lambda表达式: ```cpp auto lambda = [](auto x) { return x * 2; }; // 参数型自动推导 ``` 2. **C++17** 结构化绑定: ```cpp std::pair<int, double> p{1, 3.14}; auto [a, b] = p; // a推导为int,b推导为double ``` 3. **C++20** 允许`auto`用于函数参数: ```cpp void print(auto&& val) { // 似模板函数 std::cout << val; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值