আমি কিভাবে কনভার্ট করব std::vector<double>
একটি থেকে double array[]
?
আমি কিভাবে কনভার্ট করব std::vector<double>
একটি থেকে double array[]
?
উত্তর:
এটি করার জন্য একটি মোটামুটি সহজ কৌশল আছে, যেহেতু স্পেকটি এখন ভেক্টররা তাদের উপাদানগুলি স্বচ্ছলভাবে সংরক্ষণ করার গ্যারান্টি দেয় :
std::vector<double> v;
double* a = &v[0];
double*
একই ডাটাতে নির্দেশ করা দরকার । এই উত্তরটি ঠিক সেই ক্ষেত্রে কাজ করে
std::vector<double> v; double* a = v.data();
কিসের জন্য? আপনাকে স্পষ্ট করতে হবে: আপনার অ্যারের প্রথম উপাদানটির জন্য কোনও পয়েন্টার বা অ্যারের দরকার আছে?
আপনি যদি এমন একটি এপিআই ফাংশন কল করছেন যা পূর্বেরটিকে প্রত্যাশা করে তবে আপনি এটি করতে পারবেন do_something(&v[0], v.size())
যেখানে এস এর v
ভেক্টর double
। একটি ভেক্টরের উপাদানগুলি সুসংগত।
অন্যথায়, আপনি কেবল প্রতিটি উপাদান কপি করতে হবে:
double arr[100];
std::copy(v.begin(), v.end(), arr);
কেবল থারই arr
যথেষ্ট নয় তা নিশ্চিত করুন , তবে তা arr
পূরণ হয়ে যায়, বা আপনার অবিচ্ছিন্ন মান রয়েছে।
size()
ফাংশন std:vector
আপনি ব্যবহার করতে হবে new
বা malloc
যে কাজ করতে। যেমন এটি ইতিমধ্যে চিহ্নিত করা হয়েছিল (আপনার দ্বারা) যা double arr[v.size()]
বৈধ নয়। নতুন স্থানে ভেক্টর ব্যবহার করা একটি ভাল ধারণা, তবে আপনি কীভাবে কোনও ভেক্টরকে অ্যারে রূপান্তর করতে পারবেন তা প্রশ্নের পুরো বিষয়টি।
vector<double> thevector;
//...
double *thearray = &thevector[0];
এটি স্ট্যান্ডার্ড দ্বারা কাজ করার গ্যারান্টিযুক্ত, তবে কিছু সতর্কতা রয়েছে: বিশেষত সুযোগে thearray
থাকাকালীন শুধুমাত্র ব্যবহারের দিকে thevector
খেয়াল রাখুন।
empty()
, অন্যথায় এটি ভয়ঙ্কর ইউবি ডাকে।
ভেক্টরগুলি কার্যকরভাবে ত্বকের নিচে অ্যারে হয়। আপনার যদি কোনও ফাংশন থাকে:
void f( double a[]);
আপনি এটিকে কল করতে পারেন:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
আপনার কোনও ভেক্টরকে আসল অ্যারে উদাহরণে রূপান্তর করার দরকার নেই।
f( &v[0] );
আপনার শেষ লাইনের জন্য
হিসাবে std::vector<int> vec
, ভিসি পেতে int*
, আপনি দুটি পদ্ধতি ব্যবহার করতে পারেন:
int * arr = & vec [0];
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++11
data()
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
আমরা ডেটা () পদ্ধতি ব্যবহার করে এটি করতে পারি। সি ++ 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;
}
std::vector<double> vec;
double* arr = vec.data();
আপনি যদি একটি ফাংশন আছে, তাহলে আপনি সম্ভবত এই প্রয়োজন: foo(&array[0], array.size());
। আপনি যদি অ্যারে দরকার এমন পরিস্থিতিতে পৌঁছাতে সক্ষম হন তবে আপনাকে অ্যাক্টেক্টর লাগানো দরকার, ভেক্টরগুলি মূলত বর্ধিত অ্যারে হয়, আপনার সর্বদা তাদের ব্যবহার করা উচিত।
এই মত কিছু করতে পারেন
vector <int> id;
vector <double> v;
if(id.size() > 0)
{
for(int i = 0; i < id.size(); i++)
{
for(int j = 0; j < id.size(); j++)
{
double x = v[i][j];
cout << x << endl;
}
}
}