Как условно добавить элемент в std :: array - C ++ 11 - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть простая программа:

#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.

Ответы [ 3 ]

1 голос
/ 27 сентября 2019

Если вы хотите, чтобы только первые три хороших числа вы указывали на следующий индекс для вставки по адресу:

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]);
  }
}
0 голосов
/ 27 сентября 2019

Размер 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");
    }
  }
}
0 голосов
/ 27 сентября 2019

Размер 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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...