Как считать произвольное число значений с помощью станд.:: копия?

Основная проблема в вашем отображении состоит в том, что вы забыли вернуть любое значение. Вы можете добавить оператор return или просто удалить скобки.

Вам также необходимо установить название каждой кнопки, чтобы быть уверенным, что пользователь может выбрать только одну кнопку за раз.

Теперь, чтобы обработать изменения, вам нужно установить значение каждого входа в имя поля и связать его с функцией изменения, которая отправит имя, которому оно принадлежит:

<input
    type='radio'
    value={this.state[name]}
    name={name}
    key={opt.id}
    onChange={this.selectionChanged(name)}
/>

И изменить функцию обработки:

selectionChanged = type => ev => {
    this.setState({ [type]: ev.target.value })
    console.log('Selection of ' + type ' changed to ' + ev.target.value)
}

Рабочий пример:

const data = {
    "food": [
        {
            "id": 1,
            "name": "Pizza",
            "options": [
                {
                    "id": 11,
                    "name": "Margherita",
                },
                {
                    "id": 12,
                    "name": "Pepperoni",
                },
                {
                    "id": 13,
                    "name": "Prosciutto",
                },
                {
                    "id": 14,
                    "name": "Prataiolo",
                }
            ]
        },
        {
            "id": 2,
            "name": "Size",
            "options": [
                {
                    "id": 21,
                    "name": "S",
                },
                {
                    "id": 22,
                    "name": "M",
                },
                {
                    "id": 23,
                    "name": "L",
                },
                {
                    "id": 24,
                    "name": "XL",
                },
            ]
        }
    ]
}

class PizzaList extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            Pizza: '',
            Size: ''
        }
    }

    selectionChanged = type => ev => {
        this.setState({ [type]: ev.target.value })
        console.log('Selection of ' + type + ' changed to ' + ev.target.value)
    }

    render() {
        return (
            <div>
                {this.props.food.map(({ id, name, options }) =>
                    <div key={id}>
                        <h2>{name}</h2>
                        {options.map((opt) =>
                            <input
                                type='radio'
                                value={opt.name}
                                name={name}
                                key={opt.id}
                                onChange={this.selectionChanged(name)}
                            />
                        )}
                    </div>
                )}
            </div>
        )
    }
}

ReactDOM.render(<PizzaList food={data.food}/>, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.5.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.5.1/umd/react-dom.production.min.js"></script>
<div id='root'/>

8
задан Jon Seigel 15 May 2010 в 20:58
поделиться

7 ответов

Вы могли произойти из istream_iterator <T>.
Хотя использование метода генератора Daemin является другой опцией, хотя я генерировал бы непосредственно в набор, а не использовал бы промежуточный вектор.

#include <set>
#include <iterator>
#include <algorithm>
#include <iostream>


template<typename T>
struct CountIter: public std::istream_iterator<T>
{
    CountIter(size_t c)
        :std::istream_iterator<T>()
        ,count(c)
    {}
    CountIter(std::istream& str)
        :std::istream_iterator<T>(str)
        ,count(0)
    {}

    bool operator!=(CountIter const& rhs) const
    {
        return (count != rhs.count) && (dynamic_cast<std::istream_iterator<T> const&>(*this) != rhs);
    }
    T operator*()
    {
        ++count;
        return std::istream_iterator<T>::operator*();
    }

    private:
        size_t  count;
};

int main()
{
    std::set<int>       x;

    //std::copy(std::istream_iterator<int>(std::cin),std::istream_iterator<int>(),std::inserter(x,x.end()));
    std::copy(
                CountIter<int>(std::cin),
                CountIter<int>(5),
                std::inserter(x,x.end())
            );
}
3
ответ дан 5 December 2019 в 14:07
поделиться

Использование:

std::copy( std::istream_iterator<int>(ins),
           std::istream_iterator<int>(),
           std::inserter(my_set, my_set.end())
         );

Отметьте пустой параметр:

std::istream_iterator<int>();
3
ответ дан 5 December 2019 в 14:07
поделиться

Errr... copy_n () алгоритм?

2
ответ дан 5 December 2019 в 14:07
поделиться

Изучение этого немного, которое я не думаю, читая непосредственно в набор, будет работать, как необходимо звонить, вставляют на нем для фактического добавления элементов (я мог ошибиться, это довольно рано утром здесь). Хотя смотря на документацию STL в VS2005 кратко я думаю, что что-то с помощью функции generate_n должно работать, например:

std::istream ins;
std::set<int> my_set;
std::vector<int> my_vec;

struct read_functor
{
    read_functor(std::istream& stream) :
        m_stream(stream)
    {
    }

    int operator()
    {
        int temp;
        m_stream >> temp;
        return temp;
    }
private:
    std::istream& m_stream;
};

std::set<int>::size_type size;
ins >> size;
my_vec.reserve(size);

std::generate_n(my_vec.begin(), size, read_functor(ins));
my_set.insert(my_vec.begin(), my_vec.end());

Надо надеяться, это или решило Вашу проблему или убедило Вас, что цикл не то, что плохо в главной схеме вещей.

2
ответ дан 5 December 2019 в 14:07
поделиться

Как насчет того, чтобы использовать альтернативный итератор, чтобы сделать обход и затем использовать функциональный объект (или лямбда) для заполнения контейнера?

istream ins;
set<int>::size_type size;
set<int> new_set;
ins >> size;
ostream_iterator<int> ins_iter(ins);

for_each(counting_iterator<int>(0), counting_iterator<int>(size),
  [&new_set, &ins_iter](int n) { new_set.insert(*ins_iter++); }
);

Конечно, это предполагает, что у Вас есть C++ 0x совместимый компилятор.

BTW, 'counting_iterator <>' является частью Повышения. Итератор.

1
ответ дан 5 December 2019 в 14:07
поделиться

Да ЦУР, но когда я хочу использовать другого структуры данных в том файле / поток? Я должен, вероятно, явно записать здесь, я хочу сохранить другой материал после этого набора, это - причина, почему я храню размер также.

0
ответ дан 5 December 2019 в 14:07
поделиться

(Отредактированный: Я должен был считать вопрос ближе...),

В то время как несколько подозревают, можно получить приблизительно правильное поведение при наличии записи в файле, который "приведет первый цикл к сбою", затем очистится, сбой обдумал поток, и начните читать больше.

Данные, без явного размера, но как это

1 1 2 3 5 8 Fibb

ФРС к коду ниже, кажется, делает то, что я имел в виду, по крайней мере, на VS2005 с STLPort.

typedef std::istream_iterator < int, char, std::char_traits ,ptrdiff_t> is_iter;
std::copy( is_iter(cin), is_iter(), inserter(my_set,my_set.end()));
cin.clear();
std::cin >> instr;
0
ответ дан 5 December 2019 в 14:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: