Simpler way to set multiple array slots to one value

前端 未结 10 2271
我寻月下人不归
我寻月下人不归 2021-02-18 16:31

I\'m coding in C++, and I have the following code:

int array[30];
array[9] = 1;
array[5] = 1;
array[14] = 1;

array[8] = 2;
array[15] = 2;
array[23] = 2;
array[1         


        
10条回答
  •  無奈伤痛
    2021-02-18 17:00

    Just for the fun of it I created a somewhat different approach which needs a bit of infrastructure allowing initialization like so:

    double array[40] = {};
    "9 5 14"_idx(array) = 1;
    "8 15 23 12"_idx(array) = 2;
    

    If the digits need to be separated by commas, there is a small change needed. In any case, here is the complete code:

    #include 
    #include 
    #include 
    #include 
    
    template 
    class assign
    {
        int  d_indices[Size];
        int* d_end;
        T*   d_array;
        void operator=(assign const&) = delete;
    public:
        assign(char const* base, std::size_t n)
            : d_end(std::copy(std::istream_iterator(
                          std::istringstream(std::string(base, n)) >> std::skipws),
                              std::istream_iterator(), this->d_indices))
            , d_array()
        {
        }
        assign(assign* as, T* a)
            : d_end(std::copy(as->begin(), as->end(), this->d_indices))
            , d_array(a) {
        }
        assign(assign const& o)
            : d_end(std::copy(o.begin(), o.end(), this->d_indices))
            , d_array(o.d_array)
        {
        }
        int const* begin() const { return this->d_indices; }
        int const* end() const   { return this->d_end; }
        template 
        assign operator()(A* array) {
            return assign(this, array);
        }
        void operator=(T const& value) {
            for (auto it(this->begin()), end(this->end()); it != end; ++it) {
                d_array[*it] = value;
            }
        }
    };
    
    assign<30> operator""_idx(char const* base, std::size_t n)
    {
        return assign<30>(base, n);
    }
    
    int main()
    {
        double array[40] = {};
        "1 3 5"_idx(array) = 17;
        "4 18 7"_idx(array) = 19;
        std::copy(std::begin(array), std::end(array),
                  std::ostream_iterator(std::cout, " "));
        std::cout << "\n";
    }
    

提交回复
热议问题