提问人:JensB 提问时间:9/21/2023 最后编辑:JensB 更新时间:9/21/2023 访问量:123
将连续数组传递给函数时,传递指针和大小,还是传递开始指针和结束指针更可取?[已结束]
When passing a contiguous array to a function, is it more preferable to pass a pointer and the size, or a begin-pointer and an end-pointer? [closed]
问:
在设计一个需要指针形式的连续数组的函数时,是否应该使用
一个。
指针和数组的大小:
void foo(int* arr, size_t size);
或者 B。
开始指针和结束指针:
void foo(int* arrBegin, int* arrEnd);
显然,两种方法中参数的总大小是相同的,但是有没有充分的理由选择其中一种而不是另一种呢?我相信方法 A. 是更常见的方法,但我看到两者都被频繁使用。在某些情况下,人们会更有意义吗,反之亦然?与另一个相比,一个有什么缺点吗?或者这无关紧要,您应该简单地选择一种方法并坚持下去?
答:
有一个最不令人惊讶的一般规则
如果我写一个像(像@Elijay建议的那样)的函数
template<typename RandomIt>
void f(RandomIt first, RandomIt last)...
我可以肯定,每个人都使用我的函数、连续容器、参数类型等指针很好地理解它。
最重要的是,第一个和最后一个是几乎所有标准库算法和容器的穿鞋。非常方便和容易理解。
我的 2 美分。
首先,不鼓励在 中使用普通的 C 样式数组。但是,如果由于某些特定原因,您仍然想使用它,那么这是您的选择,如果它仅用于数组,那么任何一种方法都可以。C++
我个人更喜欢方法 B,即开始和结束迭代器(使用迭代器而不是裸指针)方法,因为当数据是连续的时,它更本能。
此外,方法 B 与方法 A 相比有一个优势 - 假设将来您需要将普通的 C 样式数组替换为容器,例如代码中的任何地方,方法 B 更灵活,因为您不需要更改调用位置的任何内容。vector
array
foo()
例如: 采用第一种方法 - 方法 A、迭代器和大小:
foo()
实现:
template <typename Iterator>
void foo1 (Iterator itrB, std::size_t sz) {
// iterate over elements
for (std::size_t i = 0; i < sz; ++i) {
// access element as itrB[i]
....
....
}
}
如果使用普通的 C 样式数组进行调用,则会是这样的:foo()
int arr[] = {1,2,3,4,5};
foo(std::cbegin(arr), sizeof (arr) / sizeof (*arr));
假设,您需要将普通的 C 样式数组替换为 ,这就是您需要调用的方式:vector
std::vector<int> arr = {1,2,3,4,5};
foo(std::cbegin(arr), arr.size());
^^^^^^^^^^^
您需要修改对数组参数的 everywhere 调用。foo()
size
容器也是如此。array
现在,采用第二种方法 - 方法 B,开始和结束迭代器:
foo()
实现:
template <typename Iterator>
void foo (Iterator itrB, Iterator itrE) {
// iterate over elements
for (auto b = itrB; b != itrE; ++b) {
// access element as *b
....
....
}
}
使用普通的 C 样式数组调用,如下所示:foo()
int arr[] = {1, 2, 3, 4, 5};
foo (std::cbegin(arr), std::cend(arr));
跟:vector
std::vector<int> arr = {1, 2, 3, 4, 5};
调用中不需要更改,相同的调用语句将起作用:foo()
foo (std::cbegin(arr), std::cend(arr));
请注意,和 中引入的 ,如果您正在使用,则分别将它们替换为 和 。std::cbegin()
std::cend()
C++14
C++11
std::begin()
std::end()
上一个:排序多维内数组 PHP
评论
template <typename ITER> foo(ITER b, ITER e)
void foo(int* arr, size_t size)
void foo(pair<int*, size_t> view)
std::span
需要考虑。std::span
std::array
std
std::sort