c++ - অবজ - কোনটি সি ভাষায় ব্যবহৃত কী ওয়ার্ড



একটি সি++ ভেক্টর উপাদান যোগ কিভাবে? (7)

আমি একটি ভেক্টর এর সব উপাদান যোগ করার সবচেয়ে সহজ উপায় খুঁজে পাওয়া যায় নি

#include <iostream>
#include<vector>
using namespace std;

int main()
{
    vector<int>v(10,1);
    int sum=0;
    for(int i=0;i<v.size();i++)
    {
        sum+=v[i];
    }
    cout<<sum<<endl;

}

এই প্রোগ্রামে, আমার আকার 10 এর একটি ভেক্টর রয়েছে এবং 1 দ্বারা সূচনা করা হয়েছে। আমি সমষ্টিতে সরল লুপের মতো সমষ্টিটি গণনা করেছি।

https://src-bin.com

std::vector এর সমস্ত উপাদানের সমষ্টি খোঁজার ভাল উপায় কী?

ধরুন, আমার মধ্যে কয়েকটি উপাদানের সাথে একটি ভেক্টর std::vector<int> vector আছে। এখন আমি সব উপাদান যোগ করতে চান। একই জন্য বিভিন্ন উপায়ে কি কি?


Answer #1

C ++ 0x শুধুমাত্র:

vector<int> v; // and fill with data
int sum {}; // or = 0 ... :)
for (int n : v) sum += n;

এটি অন্যত্র উল্লিখিত BOOST_FOREACH এর অনুরূপ এবং আরও জটিল পরিস্থিতির ক্ষেত্রে স্বচ্ছতার একই সুবিধা রয়েছে, তুলনামূলকভাবে ব্যবহৃত বা ব্যবহৃত ফাংশ্টগুলির তুলনায় এটি ব্যবহৃত হয়।


Answer #2

আসলে বেশ কয়েকটি পদ্ধতি আছে।

int sum_of_elems = 0;

সি ++ 03

  1. লুপ জন্য ক্লাসিক:

    for(std::vector<int>::iterator it = vector.begin(); it != vector.end(); ++it)
        sum_of_elems += *it;
  2. একটি স্ট্যান্ডার্ড অ্যালগরিদম ব্যবহার করে:

    #include <numeric>
    
    sum_of_elems = std::accumulate(vector.begin(), vector.end(), 0);

    পতাকা

    জমা দিয়ে সতর্ক থাকুন। শেষ আর্গুমেন্টের প্রকারটি কেবল প্রাথমিক মানের জন্য নয়, তবে ফলাফলের প্রকারের জন্যও ব্যবহৃত হয়। যদি আপনি কোনও int রাখেন, তবে ভেক্টরটি ভাসা থাকলেও এটি ইনসেটগুলিকে জমা করবে। যদি আপনি ভাসমান-বিন্দু সংখ্যার 0.0f হন, 0 থেকে 0.0 বা 0.0f পরিবর্তন করুন ( 0.0f ধন্যবাদ)।

সি ++ 11 এবং উচ্চতর

  1. std::for_each ব্যবহার করে:

    std::for_each(vector.begin(), vector.end(), [&] (int n) {
        sum_of_elems += n;
    });
  2. লুপের জন্য একটি পরিসীমা ভিত্তিক ব্যবহার করে (রজার পাটকে ধন্যবাদ):

    for (auto& n : vector)
        sum_of_elems += n;

Answer #3

এটা সহজ. সি ++ 11 একটি ভেক্টর উপাদান যোগ করার জন্য একটি সহজ উপায় প্রদান করে।

sum = 0; 
vector<int> vec = {1,2,3,4,5,....}
for(auto i:vec) 
   sum+=i;
cout<<" The sum is :: "<<sum<<endl; 

Answer #4

প্রসুস ইতোমধ্যেই এটি করার বিভিন্ন উপায় (এবং ভাল) করার প্রস্তাব দিয়েছে, যার মধ্যে কোনটি এখানে পুনরাবৃত্তি করার প্রয়োজন নেই। আমি গতি জন্য একটি বিকল্প পদ্ধতির পরামর্শ দিতে চাই।

যদি আপনি এটি বেশ কিছুটা করতে যাচ্ছেন, তবে আপনি আপনার ভেক্টরটিকে "সাব-ক্লাসিং" বিবেচনা করতে পারেন যাতে আলাদা উপাদানগুলি পৃথকভাবে বজায় রাখা যায় ( আসলে উপ-শ্রেণিবদ্ধ ভেক্টর যা অভাবের কারণে ভার্চুয়াল ধ্বংসাত্মক - আমি এমন একটি শ্রেণির কথা বলছি যার মধ্যে সমষ্টি এবং ভেক্টর রয়েছে, has-a চেয়ে বরং is-a , এবং ভেক্টর-এর মতো পদ্ধতি সরবরাহ করে)।

একটি খালি ভেক্টর জন্য, যোগ শূন্য সেট করা হয়। ভেক্টর প্রতি সন্নিবেশ উপর, যোগ যোগ উপাদান যোগ করা। প্রতিটি মুছে ফেলার উপর, এটা কমান। মূলত, অন্তর্নিহিত ভেক্টর পরিবর্তন করতে পারে এমন কিছু যা সংখ্যার সামঞ্জস্যপূর্ণ রাখা নিশ্চিত করতে আটকা পড়ে।

এই ভাবে, আপনার যেকোনো সময়ে সমষ্টিটি "গণনা" করার জন্য খুব কার্যকরী ও (1) পদ্ধতি রয়েছে (কেবল বর্তমানে গণনা করা সমষ্টিটি ফেরত দিন)। সন্নিবেশ এবং মুছে ফেলা আপনি সামঞ্জস্য হিসাবে সামান্য আর সময় নিতে হবে এবং আপনি এই কর্মক্ষমতা বিবেচনা বিবেচনা করা উচিত।

ভেক্টর যেখানে ভেক্টরের তুলনায় বেশি পরিমাণে যোগ প্রয়োজন, এই স্কীম থেকে উপকৃত হওয়ার সম্ভাবনা রয়েছে, যেহেতু সমষ্টি গণনা করার খরচটি সমস্ত অ্যাক্সেসের উপর অমর করা হয়। স্পষ্টতই, যদি প্রতি ঘন্টায় কেবলমাত্র সমষ্টি প্রয়োজন হয় এবং ভেক্টর এক সেকেন্ডে তিন হাজার বার পরিবর্তন করে তবে এটি উপযুক্ত হবে না।

এই মত কিছু যথেষ্ট হবে:

class UberVector:
    private Vector<int> vec;
    private int sum;

    public UberVector():
        vec = new Vector<int>();
        sum = 0;

    public getSum():
        return sum;

    public add (int val):
        rc = vec.add (val)
        if rc == OK:
            sum = sum + val
        return rc

    public delindex (int idx):
        val = 0
        if idx >= 0 and idx < vec.size:
            val = vec[idx]
        rc =  vec.delindex (idx)
        if rc == OK:
            sum = sum - val
        return rc

স্পষ্টতই, এটি ছদ্ম-কোড এবং আপনি আরও কিছু কার্যকারিতা থাকতে চাইতে পারেন তবে এটি মূল ধারণাটি দেখায়।


Answer #5

স্টেড :: ওয়ারারের মতো এটি ব্যবহার করতে পারেন

#include<iostream>
#include<vector>
#include<valarray>

int main()
{
std::vector<int> seq{1,2,3,4,5,6,7,8,9,10};
std::valarray<int> seq_add {seq.data(), seq.size()};
std::cout << "sum = " << seq_add.sum() << "\n";

return 0;
}

ভ্যালারের আকার যতটা ভেক্টরের আকারের মতো বড় হতে হবে এবং ভ্যালার্রে শুরু করতে সময় লাগবে, ততক্ষণ কেউ কেউ এই পদ্ধতিটি কার্যকর করতে পারবেন না।

যে ক্ষেত্রে এটি ব্যবহার করবেন না এবং ক্রম সংক্ষেপে অন্য উপায় হিসাবে এটি গ্রহণ।

ধন্যবাদ


Answer #6
#include<boost/range/numeric.hpp>
int sum = boost::accumulate(vector, 0);




vector