12

我现在脑子里放了个屁,我正在寻找一种快速的方法来获取一个数组并将其中的一半传递给一个函数。如果我有一个包含十个元素的数组 A,在某些语言中,我可以将 A[5:] 之类的东西传递给函数并完成它。c++中是否有类似的构造?显然我想避免和排序循环功能。

4

2 回答 2

10

是的。在纯 C 中,您使用指针,但在 C++ 中,您可以使用任何类型的迭代器(指针可以被视为迭代器)。

template<typename Iter>
void func(Iter arr, size_t len) { ... }

int main() {
    int arr[10];
    func(arr, 10);    // whole array
    func(arr, 5);     // first five elements
    func(arr + 5, 5); // last five elements

    std::vector<Thing> vec = ...;
    func(vec.begin(), vec.size());          // All elements
    func(vec.begin(), 5);                   // first five
    func(vec.begin() + 5, vec.size() - 5);  // all but first 5

    return 0;
}

典型的技巧是将指针传递给数组的第一个元素,然后使用单独的参数来传递数组的长度。不幸的是,没有边界检查,所以你必须小心把它做对,否则你会在你的记忆中乱涂乱画。

您也可以使用半开范围。这是最常见的方法。标准库中的许多函数(如std::sort)以这种方式工作。

template<class Iter>
void func(Iter start, Iter end) { ... }

int main() {
    int arr[10];
    func(arr, arr + 10);       // whole array
    func(arr, arr + 5);        // first five elements
    func(arr + 5, arr + 10);   // last five elements

    std::vector<Thing> vec = ...;
    func(vec.begin(), vec.end());       // whole vector
    func(vec.begin(), vec.begin() + 5); // first five elements
    func(vec.begin() + 5, vec.end());   // all but the first five elements

    return 0;
}

同样,没有边界检查。

于 2012-11-27T01:42:38.670 回答
2

我也有相同的用途,但我使用了向量并使用了语法

vector <int> a(10);
// for example to use by removing first element

a = std::vector<int>(a.begin() + 1, a.end())
//its ur turn to change the size
于 2020-04-08T19:04:46.603 回答