C++ Vector容器使用方法详解

news2024/11/18 21:40:01

Vector概述

      C++ 标准库向量类是序列容器的类模板。 向量以线性排列方式存储给定类型的元素,并允许快速随机访问任何元素。 向量是需要力求保证访问性能时的首选序列容器。vector是种容器,类似数组一样,但它的size可以动态改变。vector的元素在内存中连续排列,这一点跟数组一样。这意味着我们元素的索引将非常快,而且也可以通过指针的偏移来获取vector中的元素。但连续排列也带来了弊端,当我们向vector中间插入一个数据时,整个vector的size变大,在内存中就需要重新分配空间,常规的做法是直接申请一个新的array,并将所有元素拷贝过去;但这么做的话,无疑太浪费时间,因此vector采用的做法是:vector会分配额外的空间,以适应size的动态增长。因此,包含同样数量元素的vector和数组相比,占用的空间会更大。而且在vector最后增加或者删除一个元素,消耗的时间是一个常数值,与vector的size无关。与其他容器(deques、lists、forward_lists)相比,vector在获取元素和对最后一个元素的操作效率上更高;

Vector语法

C++

template <class Type, class Allocator = allocator<Type>>
class vector

Vector参数

Type
要存储在矢量中的元素数据类型

Allocator
表示所存储分配器对象的类型,该分配器对象封装有关矢量的内存分配和解除分配的详细信息。 此参数为可选参数,默认值为 allocator<Type>

Vector注解

向量允许在序列末尾插入和删除常量事件。 若要在矢量中间插入或删除元素,则需要线性时间。 deque 类容器在序列开头和末尾的插入和删除速度更快。 list 类容器在序列中任何位置的插入和删除速度更快。

当成员函数必须将矢量对象中所含序列增加到超过其当前存储容量时,将进行矢量重新分配。 其他的插入和删除均可能改变序列中的各个存储地址。 在所有此类情况下,指向序列更改部分的迭代器或引用将变为无效。 如果未进行重新分配,则只有插入/删除点前的迭代器和引用保持有效。

vector<bool> 类是 bool 类型的元素的类模板向量的完全专用化。 它具有专用化使用的基础类型的分配器。

vector<bool> 引用类是一个嵌套类,其对象可以提供对 vector<bool> 对象内的元素(单一位)的引用。

Vector成员

构造函数

名称说明
vector构造一个向量,它具有特定大小、具有特定值的元素、具有特定 allocator,或将其构造成某个其它向量的副本。

Typedef

名称说明
[allocator_type](#allocator_type)一个类型,它表示矢量对象的 allocator 类。
const_iterator一个类型,它提供可读取矢量中 const 元素的随机访问迭代器。
const_pointer一个类型,它提供指向矢量中 const 元素的指针。
const_reference一个类型,它提供对向量中存储的 const 元素的引用。 它用于读取和执行 const 操作。
const_reverse_iterator一个类型,它提供可读取矢量中任何 const 元素的随机访问迭代器。
difference_type一个类型,它提供矢量中两个元素的址间的差异。
iterator一个类型,它提供可读取或修改向量中任何元素的随机访问迭代器。
pointer一个类型,提供指向向量中元素的指针。
reference一个类型,它提供对向量中存储的元素的引用。
reverse_iterator一个类型,它提供可读取或修改反向矢量中的任意元素的随机访问迭代器。
size_type一个类型,它计算矢量中的元素数目。
value_type一个类型,它代表向量中存储的数据类型。

函数

名称说明
assign清除矢量并将指定的元素复制到该空矢量。
at返回对矢量中指定位置的元素的引用。
back返回对向量中最后一个元素的引用。
begin对该向量中第一个元素返回随机访问迭代器。
capacity返回在不分配更多的存储的情况下向量可以包含的元素数。
cbegin返回指向向量中第一个元素的随机访问常量迭代器。
cend返回一个随机访问常量迭代器,它指向刚超过矢量末尾的位置。
crbegin返回一个指向反向矢量中第一个元素的常量迭代器。
crend返回一个指向反向矢量末尾的常量迭代器。
clear清除向量的元素。
data返回指向向量中第一个元素的指针。
emplace将就地构造的元素插入到指定位置的向量中。
emplace_back将一个就地构造的元素添加到向量末尾。
empty测试矢量容器是否为空。
end返回指向矢量末尾的随机访问迭代器。
erase从指定位置删除向量中的一个元素或一系列元素。
front返回对向量中第一个元素的引用。
get_allocator将对象返回到矢量使用的 allocator 类。
insert将一个元素或多个元素插入到指定位置的向量中。
max_size返回向量的最大长度。
pop_back删除矢量末尾处的元素。
push_back在矢量末尾处添加一个元素。
rbegin返回指向反向向量中第一个元素的迭代器。
rend返回一个指向反向矢量末尾的迭代器。
reserve保留向量对象的最小存储长度。
resize为矢量指定新的大小。
shrink_to_fit放弃额外容量。
size返回向量中的元素数量。
swap交换两个向量的元素。

运算符

名称说明
operator[]返回对指定位置的矢量元素的引用。
operator=用另一个向量的副本替换该向量中的元素。

allocator_type

一个类型,它代表向量对象的分配器类。

C++

typedef Allocator allocator_type;

注解

allocator_type 是模板参数 Allocator 的同义词。

示例

有关使用 allocator_type 的示例,请参阅 get_allocator 的示例。

assign

清除矢量并将指定的元素复制到该空矢量。

C++

void assign(size_type count, const Type& value);
void assign(initializer_list<Type> init_list);

template <class InputIterator>
void assign(InputIterator first, InputIterator last);

参数

first
要复制的元素范围内的第一个元素的位置。

last
要复制的元素范围外的第一个元素的位置。

count
要插入到矢量的元素的副本数。

value
插入到向量中的元素的值。

init_list
包含要插入的元素的 initializer_list。

注解

首先,assign 擦除向量中的所有现有元素。 然后,assign 将指定范围内的元素从原始向量插入某个向量中,或者将新的指定值元素的副本插入某个向量。

示例

C++

/ vector_assign.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    vector<int> v1, v2, v3;

    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);

    cout << "v1 = ";
    for (auto& v : v1){
        cout << v << " ";
    }
    cout << endl;

    v2.assign(v1.begin(), v1.end());
    cout << "v2 = ";
    for (auto& v : v2){
        cout << v << " ";
    }
    cout << endl;

    v3.assign(7, 4);
    cout << "v3 = ";
    for (auto& v : v3){
        cout << v << " ";
    }
    cout << endl;

    v3.assign({ 5, 6, 7 });
    for (auto& v : v3){
        cout << v << " ";
    }
    cout << endl;
}

 

 

at

返回对矢量中指定位置的元素的引用。

C++

reference at(size_type position);

const_reference at(size_type position) const;

参数

position
要在矢量中引用的元素的下标或位置编号。

返回值

对自变量中的下标元素的引用。 如果 position 大于向量的大小,则 at 会引发异常。

注解

如果将 at 的返回值分配给 const_reference,则可以修改向量对象。 如果将 at 的返回值分配给 reference,则可以修改矢量对象。

示例

C++

// vector_at.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 20 );

   const int &i = v1.at( 0 );
   int &j = v1.at( 1 );
   cout << "The first element is " << i << endl;
   cout << "The second element is " << j << endl;
}

 

 

Output

The first element is 10
The second element is 20

back

返回对向量中最后一个元素的引用。

C++

reference back();

const_reference back() const;

返回值

向量的最后一个元素。 如果向量为空,则返回值不确定。

注解

如果将 back 的返回值分配给 const_reference,则可以修改向量对象。 如果将 back 的返回值分配给 reference,则可以修改矢量对象。

当使用定义为 1 或 2 的 _ITERATOR_DEBUG_LEVEL 进行编译时,如果试图访问空向量中的元素,则将发生运行时错误。 有关详细信息,请参阅检查的迭代器。

示例

C++

// vector_back.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main() {
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 11 );

   int& i = v1.back( );
   const int& ii = v1.front( );

   cout << "The last integer of v1 is " << i << endl;
   i--;
   cout << "The next-to-last integer of v1 is "<< ii << endl;
}

 

 

begin

对该向量中第一个元素返回随机访问迭代器。

C++

const_iterator begin() const;

iterator begin();

返回值

发现 vector 中第一个元素或空 vector 之后的位置的随机访问迭代器。 始终将返回的值与 vector::end 进行比较以确保其有效。

注解

如果将 begin 的返回值分配给 vector::const_iterator,则无法修改 vector 对象。 如果将 begin 的返回值分配给 vector::iterator,则可以修改 vector 对象。

示例

C++

// vector_begin.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    vector<int> c1;
    vector<int>::iterator c1_Iter;
    vector<int>::const_iterator c1_cIter;

    c1.push_back(1);
    c1.push_back(2);

    cout << "The vector c1 contains elements:";
    c1_Iter = c1.begin();
    for (; c1_Iter != c1.end(); c1_Iter++)
    {
        cout << " " << *c1_Iter;
    }
    cout << endl;

    cout << "The vector c1 now contains elements:";
    c1_Iter = c1.begin();
    *c1_Iter = 20;
    for (; c1_Iter != c1.end(); c1_Iter++)
    {
        cout << " " << *c1_Iter;
    }
    cout << endl;

    // The following line would be an error because iterator is const
    // *c1_cIter = 200;
}

 

 

Output

The vector c1 contains elements: 1 2
The vector c1 now contains elements: 20 2

capacity

返回在不分配更多的存储的情况下向量可以包含的元素数。

C++复制

size_type capacity() const;

返回值

分配给该向量的当前存储长度。

注解

如果为成员函数 resize 分配了足够的内存,它将更高效。 使用成员函数 reserve 指定分配的内存量。

示例

C++

// vector_capacity.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 1 );
   cout << "The length of storage allocated is "
        << v1.capacity( ) << "." << endl;

   v1.push_back( 2 );
   cout << "The length of storage allocated is now "
        << v1.capacity( ) << "." << endl;
}

 

 

Output

The length of storage allocated is 1.
The length of storage allocated is now 2.

cbegin

返回确定范围中第一个元素地址的 const 迭代器。

C++

const_iterator cbegin() const;

返回值

const 随机访问迭代器,指向范围的第一个元素,或刚超出空范围末尾的位置(对于空范围,cbegin() == cend())。

注解

由于使用 cbegin 的返回值,因此不能修改范围中的元素。

可以使用此成员函数替代 begin() 成员函数,以保证返回值为 const_iterator。 它一般与 auto 类型推导关键字一起使用,如以下示例所示。 在此示例中,将 Container 视为支持 begin() 和 cbegin() 的可修改的 (non- const) 任何类型的容器。

C++

auto i1 = Container.begin();
// i1 is Container<T>::iterator
auto i2 = Container.cbegin();

// i2 is Container<T>::const_iterator

cend

返回 const 超过末尾迭代器,该迭代器指向向量最后一个元素之后的元素。

C++

const_iterator cend() const;

返回值

向量的 const 超过末尾迭代器。 它指向向量最后一个元素之后的元素。 该元素是一个占位符,不应取消引用。 仅将它用于比较。 如果该向量为空,则返回 vector::cend() == vector::cbegin()

注解

cend 用于测试迭代器是否超过了其范围的末尾。

可以使用此成员函数替代 end() 成员函数,以保证返回值为 const_iterator。 它一般与 auto 类型推导关键字一起使用,如以下示例所示。 在此示例中,将 Container 视为支持 end() 和 cend() 的可修改的 (non- const) 任何类型的容器。

C++

auto i1 = Container.end();
// i1 is Container<T>::iterator
auto i2 = Container.cend();

// i2 is Container<T>::const_iterator

不应对 cend 返回的值取消引用。 仅将它用于比较。

clear

清除向量的元素。

C++

void clear();

示例

C++

// vector_clear.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );

   cout << "The size of v1 is " << v1.size( ) << endl;
   v1.clear( );
   cout << "The size of v1 after clearing is " << v1.size( ) << endl;
}

 

 

Output

The size of v1 is 3
The size of v1 after clearing is 0

const_iterator

一个类型,它提供可读取矢量中 const 元素的随机访问迭代器。

C++

typedef implementation-defined const_iterator;

注解

const_iterator 类型不能用于修改元素的值。

示例

有关使用 const_iterator 的示例,请参阅 back 的示例。

const_pointer

一个类型,它提供指向矢量中 const 元素的指针。

C++

typedef typename Allocator::const_pointer const_pointer;

注解

const_pointer 类型不能用于修改元素的值。

iterator 更常用于访问矢量元素。

const_reference

一个类型,它提供对向量中存储的 const 元素的引用。 它用于读取和执行 const 操作。

C++

typedef typename Allocator::const_reference const_reference;

注解

const_reference 类型不能用于修改元素的值。

示例

C++

// vector_const_ref.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 20 );

   const vector <int> v2 = v1;
   const int &i = v2.front( );
   const int &j = v2.back( );
   cout << "The first element is " << i << endl;
   cout << "The second element is " << j << endl;

   // The following line would cause an error as v2 is const
   // v2.push_back( 30 );
}

Output

The first element is 10
The second element is 20

const_reverse_iterator

一个类型,它提供可读取矢量中任何 const 元素的随机访问迭代器。

C++

typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

注解

const_reverse_iterator 类型无法修改元素的值,它用于反向循环访问向量。

示例

有关如何声明和使用迭代器的示例,请参阅 rbegin。

crbegin

返回一个指向反向矢量中第一个元素的常量迭代器。

C++

const_reverse_iterator crbegin() const;

返回值

发现反向 vector 中的第一个元素或发现曾是非反向 vector 中的最后一个元素的常量反向随机访问迭代器。

注解

返回值为 crbegin 时,无法修改 vector 对象。

示例

C++

// vector_crbegin.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator v1_Iter;
   vector <int>::const_reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   v1_Iter = v1.begin( );
   cout << "The first element of vector is "
        << *v1_Iter << "." << endl;

   v1_rIter = v1.crbegin( );
   cout << "The first element of the reversed vector is "
        << *v1_rIter << "." << endl;
}

 

 

Output

The first element of vector is 1.
The first element of the reversed vector is 2.

crend

返回 const 超过末尾反向迭代器,该迭代器指向反向向量最后一个元素之后的元素。

C++

const_reverse_iterator crend() const;

返回值

反向向量的 const 反向超过末尾迭代器。 它指向反向向量最后一个元素之后的元素,该元素与非反向向量第一个元素之前的元素相同。 该元素是一个占位符,不应取消引用。 仅将它用于比较。

注解

crend 用于反向 vector,正如 vector::cend 用于 vector 一样。

由于使用 crend 的返回值(适当递减),因此不能修改 vector 对象。

crend 可用于测试反向迭代器是否已到达其 vector 的末尾。

不应对 crend 返回的值取消引用。 仅将它用于比较。

示例

C++

// vector_crend.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::const_reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   for ( v1_rIter = v1.rbegin( ) ; v1_rIter != v1.rend( ) ; v1_rIter++ )
      cout << *v1_rIter << endl;
}

Output

2
1

data

返回指向向量中第一个元素的指针。

C++

const_pointer data() const;

pointer data();

返回值

一个指针,它指向 vector 中第一个元素或紧随空 vector 后的位置。

示例

C++

// vector_data.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    vector<int> c1;
    vector<int>::pointer c1_ptr;
    vector<int>::const_pointer c1_cPtr;

    c1.push_back(1);
    c1.push_back(2);

    cout << "The vector c1 contains elements:";
    c1_cPtr = c1.data();
    for (size_t n = c1.size(); 0 < n; --n, c1_cPtr++)
    {
        cout << " " << *c1_cPtr;
    }
    cout << endl;

    cout << "The vector c1 now contains elements:";
    c1_ptr = c1.data();
    *c1_ptr = 20;
    for (size_t n = c1.size(); 0 < n; --n, c1_ptr++)
    {
        cout << " " << *c1_ptr;
    }
    cout << endl;
}

 

Output

The vector c1 contains elements: 1 2
The vector c1 now contains elements: 20 2

difference_type

一个类型,它提供引用同一向量中元素的两个迭代器之间的差异。

C++

typedef typename Allocator::difference_type difference_type;

注解

difference_type 也可以被描述为两个指针之间的元素数,因为指向一个元素的指针包含其地址。

iterator 更常用于访问矢量元素。

示例

C++

// vector_diff_type.cpp
// compile with: /EHsc
#include <iostream>
#include <vector>
#include <algorithm>

int main( )
{
   using namespace std;

   vector <int> c1;
   vector <int>::iterator c1_Iter, c2_Iter;

   c1.push_back( 30 );
   c1.push_back( 20 );
   c1.push_back( 30 );
   c1.push_back( 10 );
   c1.push_back( 30 );
   c1.push_back( 20 );
   c1.push_back(10);
   c1.push_back(10);
   c1.push_back(10);
   c1.push_back(30);
   c1.push_back(30);
   c1.push_back(30);
   c1.push_back(30);
   c1.push_back(30);
   c1.push_back(30);
   c1.push_back(30);

   c1_Iter = c1.begin( );
   c2_Iter = c1.end( );

   vector <int>::difference_type   df_typ1, df_typ2, df_typ3;

   df_typ1 = count( c1_Iter, c2_Iter, 10 );
   df_typ2 = count( c1_Iter, c2_Iter, 20 );
   df_typ3 = count( c1_Iter, c2_Iter, 30 );
   cout << "The number '10' is in c1 collection " << df_typ1 << " times.\n";
   cout << "The number '20' is in c1 collection " << df_typ2 << " times.\n";
   cout << "The number '30' is in c1 collection " << df_typ3 << " times.\n";
}

 

 

 

Output

The number '10' is in c1 collection 1 times.
The number '20' is in c1 collection 2 times.
The number '30' is in c1 collection 3 times.

emplace

将就地构造的元素插入到指定位置的向量中。

C++

template <class... Types>
iterator emplace(
    const_iterator position,
    Types&&... args);

参数

position
vector 中插入第一个元素的位置。

args
构造函数参数。 函数根据所提供的自变量来推断要调用的构造函数重载。

返回值

该函数将返回一个指向 vector 中新元素的插入位置的迭代器。

注解

任何插入操作都可能产生巨额开销,请参阅 vector 类,了解有关 vector 性能的讨论。

示例

C++

// vector_emplace.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator Iter;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );

   cout << "v1 =" ;
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

// initialize a vector of vectors by moving v1
   vector < vector <int> > vv1;

   vv1.emplace( vv1.begin(), move( v1 ) );
   if ( vv1.size( ) != 0 && vv1[0].size( ) != 0 )
      {
      cout << "vv1[0] =";
      for (Iter = vv1[0].begin( ); Iter != vv1[0].end( ); Iter++ )
         cout << " " << *Iter;
      cout << endl;
      }
}

 

 

Output

v1 = 10 20 30
vv1[0] = 10 20 30

emplace_back

将一个就地构造的元素添加到向量末尾。

C++

template <class... Types>
void emplace_back(Types&&... args);

参数

args
构造函数参数。 函数根据所提供的自变量来推断要调用的构造函数重载。

示例

C++

#include <vector>
struct obj
{
   obj(int, double) {}
};

int main()
{
   std::vector<obj> v;
   v.emplace_back(1, 3.14); // obj in created in place in the vector
}

empty

测试矢量是否为空。

C++

bool empty() const;

返回值

如果向量为空,则返回 true;如果向量不为空,则返回 false

示例

C++

// vector_empty.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );

   if ( v1.empty( ) )
      cout << "The vector is empty." << endl;
   else
      cout << "The vector is not empty." << endl;
}

Output

The vector is not empty.

end

返回超过末尾迭代器,该迭代器指向向量最后一个元素之后的元素。

C++

iterator end();

const_iterator end() const;

返回值

向量的超过末尾迭代器。 它指向向量最后一个元素之后的元素。 该元素是一个占位符,不应取消引用。 仅将它用于比较。 如果该向量为空,则返回 vector::end() == vector::begin()

注解

如果将 end 的返回值分配给 const_iterator 类型的变量,则无法修改向量对象。 如果将 end 的返回值分配给 iterator 类型的变量,则可以修改向量对象。

示例

C++

// vector_end.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>
int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator v1_Iter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   for ( v1_Iter = v1.begin( ) ; v1_Iter != v1.end( ) ; v1_Iter++ )
      cout << *v1_Iter << endl;
}

Output

1
2

erase

从指定位置删除向量中的一个元素或一系列元素。

C++

iterator erase(
    const_iterator position);

iterator erase(
    const_iterator first,
    const_iterator last);

参数

position
要从向量中移除的元素的位置。

first
要从向量中移除的第一个元素的位置。

last
紧接要从向量中移除的最后一个元素的位置。

返回值

一个迭代器,它指定已移除的任何元素之外保留的第一个元素或指向向量末尾的指针(若此类元素不存在)。

示例

C++

// vector_erase.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator Iter;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );
   v1.push_back( 40 );
   v1.push_back( 50 );

   cout << "v1 =" ;
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.erase( v1.begin( ) );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;
}

Output

v1 = 10 20 30 40 50
v1 = 20 30 40 50
v1 = 20 50

front

返回对向量中第一个元素的引用。

C++

reference front();

const_reference front() const;

返回值

对向量对象中第一个元素的引用。 如果向量为空,则返回值不确定。

注解

如果将 front 的返回值分配给 const_reference,则可以修改向量对象。 如果将 front 的返回值分配给 reference,则可以修改矢量对象。

当使用定义为 1 或 2 的 _ITERATOR_DEBUG_LEVEL 进行编译时,如果试图访问空向量中的元素,则将发生运行时错误。 有关详细信息,请参阅检查的迭代器。

示例

C++

// vector_front.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 11 );

   int& i = v1.front( );
   const int& ii = v1.front( );

   cout << "The first integer of v1 is "<< i << endl;
   // by incrementing i, we move the front reference to the second element
   i++;
   cout << "Now, the first integer of v1 is "<< i << endl;
}

get_allocator

返回用于构造矢量的分配器对象的一个副本。

C++

Allocator get_allocator() const;

返回值

向量所使用的分配器。

注解

矢量类的分配器指定类管理存储的方式。 C++ 标准库容器类提供的默认分配器足以满足大多编程需求。 编写和使用你自己的分配器类是高级 C++ 功能。

示例

C++

// vector_get_allocator.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   // The following lines declare objects that use the default allocator.
   vector<int> v1;
   vector<int, allocator<int> > v2 = vector<int, allocator<int> >(allocator<int>( )) ;

   // v3 will use the same allocator class as v1
   vector <int> v3( v1.get_allocator( ) );

   vector<int>::allocator_type xvec = v3.get_allocator( );
   // You can now call functions on the allocator class used by vec
}

insert

将一个、多个或一系列元素插入到指定位置的向量中。

C++

iterator insert(
    const_iterator position,
    const Type& value);

iterator insert(
    const_iterator position,
    Type&& value);

void insert(
    const_iterator position,
    size_type count,
    const Type& value);

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

参数

position
向量中插入第一个元素的位置。

value
插入到向量中的元素的值。

count
插入向量中的元素数目。

first
要复制的范围元素中的第一个元素的位置。

last
要复制的元素范围以外的第一个元素的位置。

返回值

前两个 insert 函数返回一个指定新元素插入到向量的位置的迭代器。

注解

前提是,first 和 last 一定不能是矢量中的迭代器,或行为不可确定。 任何插入操作都可能产生巨额开销,请参阅 vector 类,了解有关 vector 性能的讨论。

示例

C++

// vector_insert.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator Iter;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );

   cout << "v1 =" ;
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.insert( v1.begin( ) + 1, 40 );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;
   v1.insert( v1.begin( ) + 2, 4, 50 );

   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   const auto v2 = v1;
   v1.insert( v1.begin( )+1, v2.begin( )+2, v2.begin( )+4 );
   cout << "v1 =";
   for (Iter = v1.begin( ); Iter != v1.end( ); Iter++ )
      cout << " " << *Iter;
   cout << endl;

// initialize a vector of vectors by moving v1
   vector < vector <int> > vv1;

   vv1.insert( vv1.begin(), move( v1 ) );
   if ( vv1.size( ) != 0 && vv1[0].size( ) != 0 )
      {
      cout << "vv1[0] =";
      for (Iter = vv1[0].begin( ); Iter != vv1[0].end( ); Iter++ )
         cout << " " << *Iter;
      cout << endl;
      }
}

Output

v1 = 10 20 30
v1 = 10 40 20 30
v1 = 10 40 50 50 50 50 20 30
v1 = 10 50 50 40 50 50 50 50 20 30
vv1[0] = 10 50 50 40 50 50 50 50 20 30

iterator

一个类型,它提供可读取或修改向量中任何元素的随机访问迭代器。

C++

typedef implementation-defined iterator;

注解

iterator 类型可用于修改元素的值。

示例

请参阅 begin 的示例。

max_size

返回向量的最大长度。

C++

size_type max_size() const;

返回值

向量的最大可取长度。

示例

C++

// vector_max_size.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::size_type i;

   i = v1.max_size( );
   cout << "The maximum possible length of the vector is " << i << "." << endl;
}

operator[]

返回对指定位置的矢量元素的引用。

C++

reference operator[](size_type position);

const_reference operator[](size_type position) const;

参数

position
矢量元素的位置。

返回值

如果指定的位置大于或等于容器大小,则结果为 undefined。

注解

如果将 operator[] 的返回值分配给 const_reference,则可以修改向量对象。 如果将 operator[] 的返回值分配给引用,则可以修改矢量对象。

当使用定义为 1 或 2 的 _ITERATOR_DEBUG_LEVEL 进行编译时,如果试图访问向量边界之外的元素,将发生运行时错误。 有关详细信息,请参阅检查的迭代器。

示例

C++

// vector_op_ref.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 20 );

   int& i = v1[1];
   cout << "The second integer of v1 is " << i << endl;
}

operator=

用另一个向量的副本替换该向量中的元素。

C++

vector& operator=(const vector& right);

vector& operator=(vector&& right);

参数

right
要复制到 vector 中的 vector。

注解

清除 vector 中的任何现有元素后,operator= 会将 right 的内容复制或移动到 vector

示例

C++

// vector_operator_as.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector<int> v1, v2, v3;
   vector<int>::iterator iter;

   v1.push_back(10);
   v1.push_back(20);
   v1.push_back(30);
   v1.push_back(40);
   v1.push_back(50);

   cout << "v1 = " ;
   for (iter = v1.begin(); iter != v1.end(); iter++)
      cout << *iter << " ";
   cout << endl;

   v2 = v1;
   cout << "v2 = ";
   for (iter = v2.begin(); iter != v2.end(); iter++)
      cout << *iter << " ";
   cout << endl;

// move v1 into v2
   v2.clear();
   v2 = move(v1);
   cout << "v2 = ";
   for (iter = v2.begin(); iter != v2.end(); iter++)
      cout << *iter << " ";
   cout << endl;
}

pointer

一个类型,提供指向向量中元素的指针。

C++

typedef typename Allocator::pointer pointer;

注解

pointer 类型可用于修改元素的值。

示例

C++

// vector_pointer.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
    using namespace std;
    vector<int> v;
    v.push_back( 11 );
    v.push_back( 22 );

    vector<int>::pointer ptr = &v[0];
    cout << *ptr << endl;
    ptr++;
    cout << *ptr << endl;
    *ptr = 44;
    cout << *ptr << endl;
}

Output

11
22
44

pop_back

删除矢量末尾处的元素。

C++

void pop_back();

注解

有关代码示例,请参阅 vector::push_back()。

push_back

在矢量末尾处添加一个元素。

C++

void push_back(const T& value);

void push_back(T&& value);

参数

value
要赋给添加到矢量末尾处的元素的值。

示例

C++

// compile with: /EHsc /W4
#include <vector>
#include <iostream>

using namespace std;

template <typename T> void print_elem(const T& t) {
    cout << "(" << t << ") ";
}

template <typename T> void print_collection(const T& t) {
    cout << "  " << t.size() << " elements: ";

    for (const auto& p : t) {
        print_elem(p);
    }
    cout << endl;
}

int main()
{
    vector<int> v;
    for (int i = 0; i < 10; ++i) {
        v.push_back(10 + i);
    }

    cout << "vector data: " << endl;
    print_collection(v);

    // pop_back() until it's empty, printing the last element as we go
    while (v.begin() != v.end()) {
        cout << "v.back(): "; print_elem(v.back()); cout << endl;
        v.pop_back();
    }
}

rbegin

返回指向反向向量中第一个元素的迭代器。

C++

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

返回值

发现反向矢量中的第一个元素或发现曾是非反向矢量中的最后一个元素的反向双向迭代器。

注解

如果将 rbegin 的返回值分配给 const_reverse_iterator,则可以修改向量对象。 如果将 rbegin 的返回值分配给 reverse_iterator,则可以修改矢量对象。

示例

C++

// vector_rbegin.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator v1_Iter;
   vector <int>::reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   v1_Iter = v1.begin( );
   cout << "The first element of vector is "
        << *v1_Iter << "." << endl;

   v1_rIter = v1.rbegin( );
   cout << "The first element of the reversed vector is "
        << *v1_rIter << "." << endl;
}

Output

The first element of vector is 1.
The first element of the reversed vector is 2.

reference

一个类型,它提供对向量中存储的元素的引用。

C++

typedef typename Allocator::reference reference;

示例

有关如何在向量类中使用 reference 的示例,请参阅 at。

rend

返回超过末尾反向迭代器,该迭代器指向反向向量最后一个元素之后的元素。

C++

const_reverse_iterator rend() const;
reverse_iterator rend();

返回值

反向向量的反向超过末尾迭代器。 它指向反向向量最后一个元素之后的元素,该元素与非反向向量第一个元素之前的元素相同。 该元素是一个占位符,不应取消引用。 仅将它用于比较。

注解

rend 用于反向向量,正如 end 用于向量一样。

如果将 rend 的返回值分配给 const_reverse_iterator,则无法修改向量对象。 如果将 rend 的返回值分配给 reverse_iterator,则可以修改矢量对象。

rend 可用于测试反向迭代器是否已到达其矢量末尾。

不应对 rend 返回的值取消引用。 仅将它用于比较。

示例

C++

// vector_rend.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   for ( v1_rIter = v1.rbegin( ) ; v1_rIter != v1.rend( ) ; v1_rIter++ )
      cout << *v1_rIter << endl;
}

Output

2
1

reserve

为向量对象保留最小的存储长度,必要时为其分配空间。

C++

void reserve(size_type count);

参数

count
要分配给向量的最小存储长度。

示例

C++

// vector_reserve.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   //vector <int>::iterator Iter;

   v1.push_back( 1 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
   v1.reserve( 20 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
}

Output

Current capacity of v1 = 1
Current capacity of v1 = 20

resize

为矢量指定新的大小。

C++

void resize(size_type new_size);
void resize(size_type new_size, Type value);

参数

new_size
矢量的新大小。

value
新大小大于旧大小时添加至矢量的新元素的初始化值。 如果省略该值,则新对象将使用其默认构造函数。

注解

如果容器的大小小于请求的大小 new_size,则 resize 会在向量中添加元素,直到该容器达到请求的大小。 如果容器的大小大于请求的大小,则 resize 会删除最接近容器末尾的元素,直到该容器达到大小 new_size。 如果容器的当前大小与请求的大小相同,则不采取任何操作。

size 表示向量的当前大小。

示例

C++

// vectorsizing.cpp
// compile with: /EHsc /W4
// Illustrates vector::reserve, vector::max_size,
// vector::resize, vector::resize, and vector::capacity.
//
// Functions:
//
//    vector::max_size - Returns maximum number of elements vector could
//                       hold.
//
//    vector::capacity - Returns number of elements for which memory has
//                       been allocated.
//
//    vector::size - Returns number of elements in the vector.
//
//    vector::resize - Reallocates memory for vector, preserves its
//                     contents if new size is larger than existing size.
//
//    vector::reserve - Allocates elements for vector to ensure a minimum
//                      size, preserving its contents if the new size is
//                      larger than existing size.
//
//    vector::push_back - Appends (inserts) an element to the end of a
//                        vector, allocating memory for it if necessary.
//
//

// The debugger cannot handle symbols more than 255 characters long.
// The C++ Standard Library often creates symbols longer than that.
// The warning can be disabled:
//#pragma warning(disable:4786)

#include <iostream>
#include <vector>
#include <string>

using namespace std;

template <typename C> void print(const string& s, const C& c) {
    cout << s;

    for (const auto& e : c) {
        cout << e << " ";
    }
    cout << endl;
}

void printvstats(const vector<int>& v) {
    cout << "   the vector's size is: " << v.size() << endl;
    cout << "   the vector's capacity is: " << v.capacity() << endl;
    cout << "   the vector's maximum size is: " << v.max_size() << endl;
}

int main()
{
    // declare a vector that begins with 0 elements.
    vector<int> v;

    // Show statistics about vector.
    cout << endl << "After declaring an empty vector:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    // Add one element to the end of the vector.
    v.push_back(-1);
    cout << endl << "After adding an element:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    for (int i = 1; i < 10; ++i) {
        v.push_back(i);
    }
    cout << endl << "After adding 10 elements:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    v.resize(6);
    cout << endl << "After resizing to 6 elements without an initialization value:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    v.resize(9, 999);
    cout << endl << "After resizing to 9 elements with an initialization value of 999:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    v.resize(12);
    cout << endl << "After resizing to 12 elements without an initialization value:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    // Ensure there's room for at least 1000 elements.
    v.reserve(1000);
    cout << endl << "After vector::reserve(1000):" << endl;
    printvstats(v);

    // Ensure there's room for at least 2000 elements.
    v.resize(2000);
    cout << endl << "After vector::resize(2000):" << endl;
    printvstats(v);
}

reverse_iterator

一个类型,它提供可读取或修改反向矢量中的任意元素的随机访问迭代器。

C++

typedef std::reverse_iterator<iterator> reverse_iterator;

注解

reverse_iterator 类型用于反向循环访问向量。

示例

请参阅 rbegin 的示例。

shrink_to_fit

放弃额外容量。

C++

void shrink_to_fit();

示例

C++

// vector_shrink_to_fit.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   //vector <int>::iterator Iter;

   v1.push_back( 1 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
   v1.reserve( 20 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
   v1.shrink_to_fit();
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
}

Output

Current capacity of v1 = 1
Current capacity of v1 = 20
Current capacity of v1 = 1

size

返回向量中的元素数量。

C++复制

size_type size() const;

返回值

向量的当前长度。

示例

C++

// vector_size.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::size_type i;

   v1.push_back( 1 );
   i = v1.size( );
   cout << "Vector length is " << i << "." << endl;

   v1.push_back( 2 );
   i = v1.size( );
   cout << "Vector length is now " << i << "." << endl;
}

Output

Vector length is 1.
Vector length is now 2.

size_type

一个类型,它计算矢量中的元素数目。

C++

typedef typename Allocator::size_type size_type;

示例

请参阅 capacity 的示例。

swap

交换两个向量的元素。

C++

void swap(
    vector<Type, Allocator>& right);

friend void swap(
    vector<Type, Allocator>& left,
    vector<Type, Allocator>& right);

参数

right
一个提供要交换的元素的向量。 或者一个其元素将与向量 left 中的元素进行交换的向量。

left
一个其元素将与向量 right 中的元素进行交换的向量。

示例

C++

// vector_swap.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1, v2;

   v1.push_back( 1 );
   v1.push_back( 2 );
   v1.push_back( 3 );

   v2.push_back( 10 );
   v2.push_back( 20 );

   cout << "The number of elements in v1 = " << v1.size( ) << endl;
   cout << "The number of elements in v2 = " << v2.size( ) << endl;
   cout << endl;

   v1.swap( v2 );

   cout << "The number of elements in v1 = " << v1.size( ) << endl;
   cout << "The number of elements in v2 = " << v2.size( ) << endl;
}

Output

The number of elements in v1 = 3
The number of elements in v2 = 2

The number of elements in v1 = 2
The number of elements in v2 = 3

value_type

一个类型,它代表向量中存储的数据类型。

C++

typedef typename Allocator::value_type value_type;

注解

value_type 是模板参数 Type 的同义词。

示例

C++

// vector_value_type.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector<int>::value_type AnInt;
   AnInt = 44;
   cout << AnInt << endl;
}

Output

44

vector

构造向量。 重载构造一个特定大小的向量,或具有特定值的元素的向量。 或者,作为其他某个向量的整体或一部分的副本。 某些重载还允许指定要使用的分配器。

C++

vector();
explicit vector(const Allocator& allocator);
explicit vector(size_type count);
vector(size_type count, const Type& value);
vector(size_type count, const Type& value, const Allocator& allocator);

vector(const vector& source);
vector(vector&& source);
vector(initializer_list<Type> init_list, const Allocator& allocator);

template <class InputIterator>
vector(InputIterator first, InputIterator last);
template <class InputIterator>
vector(InputIterator first, InputIterator last, const Allocator& allocator);

参数

allocator
要用于此对象的分配器类。 get_allocator 返回对象的分配器类。

count
构造的矢量中的元素数。

value
构造的矢量中的元素值。

source
要成为副本的构造的矢量中的矢量。

first
要复制的元素范围内的第一个元素的位置。

last
要复制的元素范围外的第一个元素的位置。

init_list
包含要复制的元素的 initializer_list

注解

所有构造函数都存储分配器对象 (allocator) 并初始化此向量。

前两个构造函数指定一个空初始矢量。 第二个构造函数显式指定要使用的分配器类型 (allocator)。

第三个构造函数指定类 count 的默认值的指定数量 (Type) 的元素的重复。

第四个和第五个构造函数指定值为 value 的 (count) 个元素的重复元素。

第六个构造函数指定矢量 source 的副本。

第七个构造函数移动矢量 source

第八个构造函数使用 initializer_list 指定元素。

第九个和第十个构造函数复制矢量的范围(firstlast)。

示例

C++

// vector_ctor.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    vector <int>::iterator v1_Iter, v2_Iter, v3_Iter, v4_Iter, v5_Iter, v6_Iter;

    // Create an empty vector v0
    vector <int> v0;

    // Create a vector v1 with 3 elements of default value 0
    vector <int> v1(3);

    // Create a vector v2 with 5 elements of value 2
    vector <int> v2(5, 2);

    // Create a vector v3 with 3 elements of value 1 and with the allocator
    // of vector v2
    vector <int> v3(3, 1, v2.get_allocator());

    // Create a copy, vector v4, of vector v2
    vector <int> v4(v2);

    // Create a new temporary vector for demonstrating copying ranges
    vector <int> v5(5);
    for (auto i : v5) {
        v5[i] = i;
    }

    // Create a vector v6 by copying the range v5[ first,  last)
    vector <int> v6(v5.begin() + 1, v5.begin() + 3);

    cout << "v1 =";
    for (auto& v : v1){
        cout << " " << v;
    }
    cout << endl;

    cout << "v2 =";
    for (auto& v : v2){
        cout << " " << v;
    }
    cout << endl;

    cout << "v3 =";
    for (auto& v : v3){
        cout << " " << v;
    }
    cout << endl;
    cout << "v4 =";
    for (auto& v : v4){
        cout << " " << v;
    }
    cout << endl;

    cout << "v5 =";
    for (auto& v : v5){
        cout << " " << v;
    }
    cout << endl;

    cout << "v6 =";
    for (auto& v : v6){
        cout << " " << v;
    }
    cout << endl;

    // Move vector v2 to vector v7
    vector <int> v7(move(v2));
    vector <int>::iterator v7_Iter;

    cout << "v7 =";
    for (auto& v : v7){
        cout << " " << v;
    }
    cout << endl;

    vector<int> v8{ { 1, 2, 3, 4 } };
    for (auto& v : v8){
        cout << " " << v ;
    }
    cout << endl;
}

Output

v1 = 0 0 0v2 = 2 2 2 2 2v3 = 1 1 1v4 = 2 2 2 2 2v5 = 0 1 2 3 4v6 = 1 2v7 = 2 2 2 2 21 2 3 4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GESP】2023年06月图形化二级 -- 时间规划

文章目录 时间规划【题目描述】【输入描述】【输出描述】【参考答案】其他测试用例 时间规划 【题目描述】 默认小猫角色和白色背景&#xff0c;小明在为自己规划学习时间。现在他想知道两个时刻之间有多少分钟。你能通过编程帮他做到吗&#xff1f; 【输入描述】 新建变量“…

餐饮市场分析(上)

阅读原文 研究某一类餐饮产品的市场概况&#xff0c;并在不同地区和品牌之间进行对比 一、数据需求 使用美团搜索商品返回的数据。 首先进入美团首页&#xff0c;切换到对应城市&#xff0c;并搜索感兴趣的关键词。接下来尝试翻页获取更多数据&#xff0c;点击下一页时发现页…

跨越时空限制,酷暑天气用VR看房是一种什么体验?

近年来&#xff0c;全球厄尔尼诺现象越来越频繁&#xff0c;夏季温度不断创下新高&#xff0c;持续大范围的高温天气让人们对出门“望而生畏”。很多购房者也不愿意在如此酷暑期间&#xff0c;四处奔波看房&#xff0c;酷暑天气让带看房效率大大降低&#xff0c;更有新闻报道&a…

Linux:LAMP-phpmyadmin

LAMP环境 (1条消息) Linux&#xff1a;LAMP搭建(全源码包安装)_鲍海超-GNUBHCkalitarro的博客-CSDN博客 phpmyadminphpMyAdminhttps://www.phpmyadmin.net/ 传进Linux tar xfz phpMyAdmin-5.2.1-all-languages.tar.gz 这个是解出来的包 mv phpMyAdmin-5.2.1-all-languages /…

【NOSQL数据库】Redis数据库的配置与优化一

目录 一、关系型数据库与非关系型数据库1.1关系型数据库1.2非关系型数据库1.3关系型数据库与非关系型数据库的区别1.3.1数据存储方式不同1.3.2扩展方式不同1.3.3对事务性的支持不同 1.4非关系型数据库产生的背景1.5总结 二、Redis简介2.1Redis的优点2.2使用场景2.3哪些数据适合…

大二网页设计实训-豆瓣首页(html+css)

免费开源一个前端网页&#xff0c;豆瓣首页&#xff0c;可以用来当实训等

探索神奇的甲方需求:提出异常要求的背后逻辑

在IT行业&#xff0c;每个人都可能遇到“神奇的甲方”和他们提出的匪夷所思甚至无厘头的需求。虽然这些要求可能让人摸不着头脑&#xff0c;但背后通常隐藏着某种逻辑和需求。让我们来探索一下这些“无理需求”背后的心理和可能的应对策略。 首先&#xff0c;为什么会出现这些…

Maven安装与配置详解

安装JDK JDK1.8所有版本官网下载链接&#xff1a; https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html 所有JDK下载地址&#xff1a; https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html 可参照我的另一篇博客 安…

Unity | HDRP高清渲染管线学习笔记:HDRP Custom Pass

目录 一、Custom Pass Volume组件介绍 1.Mode&#xff08;模式&#xff09; 2.Injection Point&#xff08;注入点&#xff09; 3.Priority 4.Fade Radius 5.custom passes 二、查看Custom Pass的渲染阶段 Custom Pass允许你执行以下操作&#xff08;官方文档&#xff0…

Linux--在当前路径下创建目录/文件夹指令:mkdir

语法&#xff1a; mkdir [选项] 文件名 功能&#xff1a; 在当前目录下创建一个名为 “文件名”的目录 常用选项&#xff1a; -p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些不存在的目录&#xff0c;即一次可以建立…

HTML5 游戏开发实战 | 贪吃蛇

在该游戏中&#xff0c;玩家操纵一条贪吃的蛇在长方形场地里行走&#xff0c;贪吃蛇按玩家所按的方向键折行&#xff0c;蛇头吃到食物(豆)后&#xff0c;分数加10分&#xff0c;蛇身会变长&#xff0c;如果贪吃蛇碰上墙壁或者自身的话&#xff0c;游戏就结束了(当然也可能是减去…

开放式耳机漏音严重吗?开放式耳机会不会吵到别人?

​在了解开放式耳机是否漏音的时候&#xff0c;首先要知道什么是开放式耳机。 开放式耳机是一种不入耳&#xff0c;没有封闭耳朵的蓝牙耳机&#xff0c;可以听歌的同时接收来自外界声音&#xff0c;安全性高&#xff0c;也减少长期佩戴耳机带来的负担&#xff0c;更适合运动佩…

E. Singers‘ Tour(数学推导)

Problem - 1618E - Codeforces 将n个城镇按顺序排列成一个环。这些城镇按顺时针顺序编号为1到n。在第i个城镇里&#xff0c;有一名歌手&#xff0c;他的曲目列表中每首歌的演唱时间为ai分钟&#xff0c;其中i∈[1,n]。 每位歌手按顺时针顺序访问所有n个城镇&#xff0c;并在…

为什么可以直接使用简单名字访问java.lang包中的公开类、接口

java.lang包中有一些基本类&#xff0c;在代码中访问这些公开的类、接口可以直接用简单的名字访问&#xff0c;而不需要用import语句显式导入。 先看下面两段示例代码&#xff0c;这两段代码的执行效果是一样的。 示例代码1–访问Math类的时候直接写简单的名字&#xff0c;而且…

pwn学习day4——ret2text

文章目录 原理&#xff1a;例子x64x32 原理&#xff1a; 覆盖函数返回地址到程序内存在的gadgets获取shell 例子 #include<stdio.h> #include<stdlib.h>void hint(){system("$0"); } int main(){char buf[0x10];printf("input: ");scanf(&q…

1.5、JAVA 初识JAVA运算符

1 运算符 1.1 概述 运算符 用于连接 表达式 的 操作数&#xff0c;并对操作数执行运算。 例如&#xff0c;表达式num1num2&#xff0c;其操作数是num1和num2&#xff0c;运算符是””。 在java语言中&#xff0c;运算符可分为5种类型&#xff1a; 算术运算符、赋值运算符、关…

数据中心可视化合集 | 图扑数字孪生机房,解锁运维新境界

IDC&#xff08;Internet Data Center&#xff09;数据中心可视化是指通过可视化的方式对数据中心的运行状态、资源使用情况、安全监控等进行展示和管理。可以帮助管理员更好地了解数据中心的运行情况和趋势&#xff0c;及时发现问题并采取措施&#xff0c;提高数据中心的运行效…

libevent实践01:准备源码、搭建项目、编译脚本和入门例子

编译源码 libevent是一个Reactor事件库。 我的理解&#xff0c;就是封装了select、epoll、poll的函数库。有使用select&#xff0c;poll&#xff0c;epoll的需求就可以使用的。 官网地址&#xff1a;https://libevent.org/ 下载源码&#xff1a; https://github.com/libev…

2023亚马逊云科技中国峰会主题演讲,分享基础架构在AI浪潮的求新求变

2023亚马逊云科技中国峰会第二天精彩继续&#xff01;6月28日&#xff0c;亚马逊云科技大中华区产品总经理陈晓建在《专注创新&#xff0c;摆脱基础架构束缚》主题演讲中提出&#xff0c;云服务是支持数字创新的关键生产力。在当前生成式AI技术爆发的大环境下&#xff0c;亚马逊…

一种快速估算PCB走线电阻的方法:方块统计

我们通常需要快速地估计出印刷电路板上一根走线或一个平面的电阻值&#xff0c;而不是进行冗繁的计算。 虽然现在已有可用的印刷电路板布局与信号完整性计算程序&#xff0c;可以精确地计算出走线的电阻&#xff0c;但在设计过程中&#xff0c;我们有时候还是希望采取快速粗略…