我正在使用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::advance和std::next.
最新的 (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)
通常你可以发送迭代器.
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)
| 归档时间: |
|
| 查看次数: |
9726 次 |
| 最近记录: |