【问题标题】:How to conditionally add element to std::array - C++11如何有条件地将元素添加到 std::array - C++11
【发布时间】:2020-01-27 07:31:53
【问题描述】:

我有一个简单的程序:

#include <array>
#include <iostream>
#include <functional>
#include <algorithm>

using namespace std;

int main(){
    array<int, 5> myArr = {3, 10, 0, 5, 7};
    int badNum = 0;
    for(int item : myArr){
        cout << item << endl;
    }

    cout << "\n" << endl;
    cout << "\n" << endl;

    sort(myArr.begin(), myArr.end(), greater<int>());

    for(int item : myArr){
        cout << item << endl;
    }

    array<int, 4> goodFour;

    for (unsigned int i = 0; i < myArr.size(); i++){
        if(myArr[i] != badNum){
            // goodThree.append(myArr[i]); <-- This is where I am stuck
        }
    }

}

我一直在尝试将元素分配给std::array。我知道在std::vector 中我可以使用push_back 方法,但是在std:array 上,如何分配给下一个(尚未分配的)元素?我来自 Python 3.x,我们有 append 方法用于 list。我不是试图改变数组的大小,而是试图用值填充分配的空间。

我看过:

http://www.cplusplus.com/forum/beginner/67707/

http://www.cplusplus.com/forum/beginner/86394/

http://www.cplusplus.com/forum/beginner/152125/

但这些都是针对向量或原始int[5] myArr 类型,而不是std::array

【问题讨论】:

  • 这根本不是重复的,事实上,它特别提到了使用std:array,而不是旧的int[x] myArr 版本,并且特别提到了不使用向量。 @GAVD
  • @JerryM。我已经根据我的回答改写了你的问题。如果我错过了重点,请随时回复。

标签: c++ arrays c++11


【解决方案1】:

如果您只想要前三个好的数字,您可以维护一个指向下一个要插入的索引的指针:

for (int i = 0, k = 0; k < 3 && i < myArr.size(); i++) {
  if (myArr[i] != badNum) {
    goodThree[k++] = myArr[i];
  }
}

如果您想要所有好的数字,您可以使用std::vector 并调用它的push_back 方法:

std::vector<int> goodThree;
for (int i = 0; i < myArr.size(); i++) {
  if (myArr[i] != badNum) {
    goodThree.push_back(myArr[i]);
  }
}

【讨论】:

  • 有没有办法实现这个没有使用向量? std::array 中没有有 push_back 方法的内容?
  • @JerryM。您在创建数组时设置了数组的大小。就像一个普通的数组int[N]一样,没有办法扩展它,当你制作它时它是一成不变的。 std::vector 的作用是添加任意数量的元素。
  • 但是如果我知道会添加多少元素呢?就是你上面描述的指针方法?
  • @JerryM。是的,如果您知道元素的数量,那么您必须在创建数组时指定该数量。在您的情况下,您将 array&lt;int, N&gt; 中的 N 替换为该数字。如果你知道会有 3 个元素,那么 array&lt;int, 3&gt; 就可以了。如果您不知道元素的数量,请使用向量。
  • 问题更是如此,如果我知道大小,如何将元素添加到固定大小std::array。我不知道我需要使用指针。正如帖子所说,我正在寻找可用于std::arrayappend 方法或push_back 方法。我不知道我需要指针。
【解决方案2】:

std::array 的大小在编译时是固定的。如果您需要在运行时附加另一个值,那么您必须使用std::vector(或类似的东西)。最接近“附加”到std::array 的方法是将其内容复制到一个包含“附加”值的另一个元素的数组中。您可以使用一些模板元编程技术来简化此操作:

template <typename T, std::size_t N, typename X, std::size_t... I>
std::array<T, N + 1> push_back(std::array<T, N> const& a, X&& x, std::index_sequence<I...>) {
  return {std::get<I>(a)..., std::forward<X>(x)};
}

template <typename T, std::size_t N, typename X>
std::array<T, N + 1> push_back(std::array<T, N> const& a, X&& x) {
  return detail::push_back(a, std::forward<X>(x), std::make_index_sequence<N>());
}

使用示例:

std::array<int, 2> a = {1, 2};
std::array<int, 3> b = push_back(a, 3);

for (int x : b) {
  std::cout << x << "\n";
}

【讨论】:

  • 我的帖子中没有任何内容表明更改了数组的大小。如果我声明一个大小为 3 的数组,但它是空白的,我该如何以上述循环格式向其中添加元素?
  • @JerryM。在单独的变量中跟踪它“包含”多少个值(根据您的程序逻辑)?
【解决方案3】:

std::array 的大小在编译时设置。这意味着您不能在运行时将值“附加”到std::array。但是,您可以通过您自己的程序逻辑来跟踪您的数组“包含”多少个值。例如:

std::array<int, 5> a = {1, 2, 3, 4, 5};
std::array<int, 4> b;

std::size_t n = 0;

for (int x : a) {
  if (x != 2) {
    if (n < std::size(a) - 1) {
      b[n++] = x;
    } else {
      throw std::out_of_range("array is full");
    }
  }
}

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 2020-12-07
    • 2014-11-17
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多