【问题标题】:Is there a way in C++ to get a sub array from an array?C++ 中有没有办法从数组中获取子数组?
【发布时间】:2020-04-09 06:57:54
【问题描述】:

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

【问题讨论】:

  • 也许你的函数应该使用迭代器。
  • 您不能将数组传递给 C++ 中的函数,因为 C++ 没有数组值。那么你的函数实际上需要什么?
  • 我有一个数组 int[] a = {1,2,3,4,5,6,7,8,9,10}。然后我正在寻找一种方法来获取子数组 int[] a1 = {6,7,8,9,10}。
  • 不,你的函数取什么参数?
  • @NicholasHazen,如果你真的需要数组而不是迭代器,你仍然可以使用类似std::vector 的东西,它有一个双迭代器构造函数:std::vector<int> a{1,2,3,4,5,6,7,8,9,10}; foo(std::vector<int>(std::next(std::begin(a), a.size() / 2), std::end(a))); 这个策略与迭代器相比真的相形见绌然而,就速度而言,更不用说易于使用了。

标签: c++ arrays


【解决方案1】:

是的。在纯 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;
}

同样,没有边界检查。

【讨论】:

  • 我想你说的模板是:template&lt;Iter&gt; void func(const Iter&amp; start, const Iter&amp; end) { ... }
  • template&lt; typename Iter &gt; void func( Iter start, Iter end )
  • 如果您想要边界检查,请使用边界检查访问,&amp;vec.at(5),如果“5”确实是“最多 5”,则使用 vec.begin()+max(5,vec.size())
  • @jthill:“max”解决方案可能会出现问题,因为它会默默地表现不同,而不是抛出错误。我通常宁愿有错误。 “at”解决方案没有给你一个迭代器,这意味着你不能将它与 vec.end() 配对,但你必须做类似 &amp;*vec.end() 的事情。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多