我们可以将部分向量作为函数参数发送吗?

moh*_*hit 16 c++ vector

我正在使用vectorc ++程序(我是初学者).
我需要发送一部分vector功能.

如果是c我需要这样做(使用数组):

int arr[5] = {1, 2, 3, 4, 5};
func(arr+2);    //to send part array {3, 4, 5}
Run Code Online (Sandbox Code Playgroud)

除了vector用最后一部分创建一个新的方法之外还有其他方法吗?

jua*_*nza 26

一种常见的方法是传递迭代器范围.这适用于所有类型的范围,包括属于标准库容器和普通数组的范围:

template <typename Iterator>
void func(Iterator start, Iterator end) 
{
  for (Iterator it = start; it !=end; ++it)
  {
     // do something
  } 
}
Run Code Online (Sandbox Code Playgroud)

然后

std::vector<int> v = ...;
func(v.begin()+2, v.end());

int arr[5] = {1, 2, 3, 4, 5};
func(arr+2, arr+5);
Run Code Online (Sandbox Code Playgroud)

注意:虽然该函数适用于所有类型的范围,但并非所有迭代器类型都支持通过中operator+使用的增量v.begin()+2.如需替代方案,请查看std::advancestd::next.

  • 我会更广泛地说:该功能适用​​于所有**范围**.容器和数组是管理范围的一种方式,但它们不是唯一的方法. (3认同)

Кон*_*Ван 8

最新的 (C++20) 方法是使用std::span. 创建一个std::span查看一部分并将其传递给函数的视图std::vector注意:元素必须在内存中连续才能std::span在容器上使用,并且std::vector在内存中也是连续的

#include <span>

std::vector<int> int_vector = {1, 2, 3, 4, 5};
std::span<int> a_span(int_vector.data() + 2, int_vector.size() - 2);
for(const int a : a_span);
for(const int& a : a_span);
function(a_span);
Run Code Online (Sandbox Code Playgroud)


Joh*_*ing 6

通常你可以发送迭代器.

static const int n[] = {1,2,3,4,5};
vector <int> vec;
copy (n, n + (sizeof (n) / sizeof (n[0])), back_inserter (vec));

vector <int>::iterator itStart = vec.begin();
++itStart; // points to `2`
vector <int>::iterator itEnd = itStart;
advance (itEnd,2); // points to 4

func (itStart, itEnd);
Run Code Online (Sandbox Code Playgroud)

这不仅仅适用于vectors.但是,由于a vector保证了可靠的存储,只要vector不重新分配,您就可以发送元素的地址:

func (&vec[1], &vec[3]);
Run Code Online (Sandbox Code Playgroud)