ভেক্টরকে অ্যারেতে কীভাবে রূপান্তর করা যায়


352

আমি কিভাবে কনভার্ট করব std::vector<double>একটি থেকে double array[]?


9
কিন্ডার প্রশ্ন কেন? আপনি অ্যারে হিসাবে কোনও ভেক্টর অ্যাক্সেস করতে পারেন। একটি অ্যারে কী করে যা ভেক্টর না করে?
মাইকেল ডারগান


7
চারপাশে যে পরিভাষা নিক্ষেপ করা হচ্ছে তা বিভ্রান্তিকর। একটি পয়েন্টার একটি অ্যারে নয়। আমরা কি একটি অ্যারের প্রথম উপাদানটির জন্য একটি পয়েন্টার বা একটি অ্যারে চাই?
GManNickG

7
একেবারে বাস্তব প্রশ্ন - খুব সাধারণ, সহজেই ব্যাখ্যা করা একটিও। দয়া করে আবার খুলুন
dbliss

10
"কিন্ডা প্রশ্ন করে কেন?" - প্রথমে, এই বাক্যাংশটির অপব্যবহার করুন। দ্বিতীয়ত, এটি রক্তাক্ত কারণ স্পষ্টতই।
জিম বাল্টার

উত্তর:


533

এটি করার জন্য একটি মোটামুটি সহজ কৌশল আছে, যেহেতু স্পেকটি এখন ভেক্টররা তাদের উপাদানগুলি স্বচ্ছলভাবে সংরক্ষণ করার গ্যারান্টি দেয় :

std::vector<double> v;
double* a = &v[0];

29
@ বাগানুক আপনি অনুলিপি করছেন না, আপনি এমন একটি পয়েন্টার তৈরি করছেন যা প্রকৃত অ্যারেটির দিকে নির্দেশ করে ভেক্টর অভ্যন্তরীণভাবে ব্যবহার করছে। আপনি যদি GMan এর উত্তরটি অনুলিপি করতে চান তবে ব্যাখ্যা করুন কীভাবে
মাইকেল মরোজেক

4
@ বাগানুক: "অ্যারে" কী? আপনার আরও তথ্য সরবরাহ করতে হবে। বড় ছবি কি?
GManNickG

6
@ বাগানুক আপনি করবেন না, আপনার কেবল double*একই ডাটাতে নির্দেশ করা দরকার । এই উত্তরটি ঠিক সেই ক্ষেত্রে কাজ করে
মাইকেল মরোজেক

6
@ গুণেইকায়েম ভেক্টর সেই স্মৃতিটির মালিক, আপনার এটিকে মুক্ত করা উচিত নয়
মাইকেল মরোজেক

23
std::vector<double> v; double* a = v.data();
sinoTrinity

147

কিসের জন্য? আপনাকে স্পষ্ট করতে হবে: আপনার অ্যারের প্রথম উপাদানটির জন্য কোনও পয়েন্টার বা অ্যারের দরকার আছে?

আপনি যদি এমন একটি এপিআই ফাংশন কল করছেন যা পূর্বেরটিকে প্রত্যাশা করে তবে আপনি এটি করতে পারবেন do_something(&v[0], v.size())যেখানে এস এর vভেক্টর double। একটি ভেক্টরের উপাদানগুলি সুসংগত।

অন্যথায়, আপনি কেবল প্রতিটি উপাদান কপি করতে হবে:

double arr[100];
std::copy(v.begin(), v.end(), arr);

কেবল থারই arrযথেষ্ট নয় তা নিশ্চিত করুন , তবে তা arrপূরণ হয়ে যায়, বা আপনার অবিচ্ছিন্ন মান রয়েছে।


15
দ্রষ্টব্য: নতুন অ্যারের জন্য উপাদানের সংখ্যা পেতে v.size () ব্যবহার করুন: ডাবল অ্যারে [v.size ()];
rbaleksandar

7
@ আরবালিক্সন্দর: অ্যারেগুলির একটি ধ্রুবক অভিব্যক্তি আকার থাকতে পারে না।
GManNickG

@ জিমনিক জি: এটি কাজ করে তবে আমি মনে করি এখানে কিছুটা ভুল বুঝাবুঝি হয়েছে। নিম্নলিখিতটি কল্পনা করুন: আপনার কাছে বিভিন্ন শ্রেণীর পয়েন্টারগুলির একটি গোছা সহ একটি শ্রেণি রয়েছে যা অ্যারেগুলিতে নির্দেশ করতে পারে, যা আপনি আপনার ক্লাসটি সংজ্ঞায়িত করার সময় জানা যায়নি এবং যা পরে বিভিন্ন ভেক্টরগুলি ফ্লাশ করে এবং তার আকার-পরামিতি ব্যবহার করে তৈরি করা হয়েছিল কত স্থান ব্যবহার করা হবে তা নির্ধারণ করতে। আর একটি উদাহরণ: একটি সাধারণ ফাংশন অকার্যকর অ্যারেস্টেস্ট (স্বাক্ষরবিহীন int arrSize), যা আকারের জন্য এটির ফাংশন-প্যারামিটার ব্যবহার করে এতে একটি অ্যারে তৈরি করে (শর্ট আর্ট [arrSize];) তৈরি করে।
rbaleksandar

1
@rbaleksandar কোন ভুল বোঝাবুঝি নয়; সি ++ 11 এবং তার আগে, অ্যারের আকারগুলি অবশ্যই অবিচ্ছেদ্য ধ্রুবক এক্সপ্রেশন হয়। আপনার ফাংশন উদাহরণটি সি-তে ভিএলএগুলির জন্য সাধারণ ব্যবহার, তবে কেবল সি ++ তে (অমানুষিক) এক্সটেনশান দ্বারা সমর্থিত। এটি সি ++ 14 এ আসতে পারে: স্ট্যাকওভারফ্লো . com / a / 17318040 / 87234 । তবে এখন পর্যন্ত এটি কোনও স্ট্যান্ডার্ড বিকল্প নয়।
GManNickG

1
@GManNickG আমি মনে করি @Jet যে বলছে আপনি একটি অ্যারের করার জন্য একটি ভেক্টর রূপান্তর করতে চান, এবং আপনি মাপ অ্যারে ব্যবহার মনস্থ করা size()ফাংশন std:vectorআপনি ব্যবহার করতে হবে newবা mallocযে কাজ করতে। যেমন এটি ইতিমধ্যে চিহ্নিত করা হয়েছিল (আপনার দ্বারা) যা double arr[v.size()]বৈধ নয়। নতুন স্থানে ভেক্টর ব্যবহার করা একটি ভাল ধারণা, তবে আপনি কীভাবে কোনও ভেক্টরকে অ্যারে রূপান্তর করতে পারবেন তা প্রশ্নের পুরো বিষয়টি।
RyanP


17
vector<double> thevector;
//...
double *thearray = &thevector[0];

এটি স্ট্যান্ডার্ড দ্বারা কাজ করার গ্যারান্টিযুক্ত, তবে কিছু সতর্কতা রয়েছে: বিশেষত সুযোগে thearrayথাকাকালীন শুধুমাত্র ব্যবহারের দিকে thevectorখেয়াল রাখুন।


4
... এবং নিশ্চিত করুন যে ভেক্টরটি নেই empty(), অন্যথায় এটি ভয়ঙ্কর ইউবি ডাকে।
এসবিআই

13

ভেক্টরগুলি কার্যকরভাবে ত্বকের নিচে অ্যারে হয়। আপনার যদি কোনও ফাংশন থাকে:

void f( double a[]);

আপনি এটিকে কল করতে পারেন:

vector <double> v;
v.push_back( 1.23 )
f( &v[0] );

আপনার কোনও ভেক্টরকে আসল অ্যারে উদাহরণে রূপান্তর করার দরকার নেই।


1
আমি মনে করি আপনি f( &v[0] );আপনার শেষ লাইনের জন্য
বোঝাচ্ছেন

10

হিসাবে std::vector<int> vec, ভিসি পেতে int*, আপনি দুটি পদ্ধতি ব্যবহার করতে পারেন:

  1. int * arr = & vec [0];

  2. int * arr = vec.data ();

যদি আপনি কোন প্রকার রূপান্তর করতে চান Tকরতে ভেক্টর T* array, শুধুমাত্র উপরের প্রতিস্থাপন intকরতে T

আমি আপনাকে দেখাব কেন উপরোক্ত দুটি কাজ করে, ভাল বোঝার জন্য?

std::vector মূলত একটি গতিশীল অ্যারে।

নীচে হিসাবে প্রধান তথ্য সদস্য:

template <class T, class Alloc = allocator<T>>
class vector{
    public:
        typedef T          value_type;
        typedef T*         iterator;
        typedef T*         pointer;
        //.......
    private:
        pointer start_;
        pointer finish_;
        pointer end_of_storage_;

    public:
        vector():start_(0), finish_(0), end_of_storage_(0){}
    //......
}

range (start_, end_of_storage_)সব অ্যারে মেমরি ভেক্টর বরাদ্দ হয়;

range(start_, finish_)সব অ্যারে মেমরি ভেক্টর ব্যবহার করা হয়;

range(finish_, end_of_storage_)ব্যাকআপ অ্যারের স্মৃতি।

উদাহরণস্বরূপ, একটি ভেক্টর ভেক হিসাবে। যার {9, 9, 1, 2, 3, 4 poin পয়েন্টারটি নীচে পছন্দ করতে পারে।

এখানে চিত্র বর্ণনা লিখুন

সুতরাং &vec[0]= সূচনা_ (ঠিকানা।) (শুরু_টি ইনট * অ্যারের মাথার সমান)

ইন সদস্য ফাংশন ঠিক ফিরে start_c++11data()

pointer data()
{ 
     return start_; //(equivalent to `value_type*`, array head)
}

2

আমরা ডেটা () পদ্ধতি ব্যবহার করে এটি করতে পারি। সি ++ 11 এই পদ্ধতিটি সরবরাহ করে।

টুকিটাকি সংকেতলিপি

#include<bits/stdc++.h>
using namespace std;


int main()
{
  ios::sync_with_stdio(false);

  vector<int>v = {7, 8, 9, 10, 11};
  int *arr = v.data();

  for(int i=0; i<v.size(); i++)
  {
    cout<<arr[i]<<" ";
  }

  return 0;
}


1

আপনি যদি একটি ফাংশন আছে, তাহলে আপনি সম্ভবত এই প্রয়োজন: foo(&array[0], array.size());। আপনি যদি অ্যারে দরকার এমন পরিস্থিতিতে পৌঁছাতে সক্ষম হন তবে আপনাকে অ্যাক্টেক্টর লাগানো দরকার, ভেক্টরগুলি মূলত বর্ধিত অ্যারে হয়, আপনার সর্বদা তাদের ব্যবহার করা উচিত।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.