কাঁচা ডেটাতে কীভাবে std :: ভেক্টর পয়েন্টার পাবেন?


160

আমি অ্যারে std::vectorহিসাবে ব্যবহার করার চেষ্টা করছি char

আমার ফাংশনটি একটি শূন্য পয়েন্টার গ্রহণ করে:

void process_data(const void *data);

আমি কেবল এই কোডটি ব্যবহার করার আগে:

char something[] = "my data here";
process_data(something);

যা প্রত্যাশা মতো কাজ করেছে।

তবে এখন আমার গতিশীলতা প্রয়োজন std::vector, সুতরাং আমি পরিবর্তে এই কোডটি চেষ্টা করেছি:

vector<char> something;
*cut*
process_data(something);

প্রশ্নটি হল, আমি কীভাবে চর ভেক্টরকে আমার ফাংশনে পাস করব যাতে আমি ভেক্টর কাঁচা ডেটা অ্যাক্সেস করতে পারি (এটি কোনও ফর্ম্যাট - ভাসমান ইত্যাদি matter)

আমি এটি চেষ্টা করেছি:

process_data(&something);

এবং এই:

process_data(&something.begin());

কিন্তু এটা অর্থহীন তথ্য একটি পয়েন্টার ফিরে এবং পরেরটির সতর্কীকরণ দিয়েছেন: warning C4238: nonstandard extension used : class rvalue used as lvalue

উত্তর:


238

&somethingআপনাকে std::vectorঅবজেক্টের ঠিকানা দেয় , এটি ধারণ করা ডেটার ঠিকানা নয়। &something.begin()আপনাকে ফেরত পাঠানো ঠিকানাটি begin()দেয় (সংকলক যেমন সতর্ক করে, প্রযুক্তিগতভাবে এটি অনুমোদিত নয় কারণ something.begin()এটি একটি মূল্যবান প্রকাশ, সুতরাং এর ঠিকানা নেওয়া যায় না)।

ধারকটির কমপক্ষে একটি উপাদান রয়েছে বলে ধরে নিলে আপনার ধারকটির প্রাথমিক উপাদানটির ঠিকানা পাওয়া উচিত, যা আপনি পেতে পারেন

  • &something[0]বা &something.front()(সূচীতে 0 উপাদানটির ঠিকানা), বা

  • &*something.begin()(পুনরাবৃত্তকারী দ্বারা নির্দেশিত উপাদানটির ঠিকানা ফিরে এসেছিল begin())।

সি ++ 11, একটি নতুন সদস্য ফাংশন যোগ করা হয়েছিল std::vector: data()। এই সদস্য ফাংশনটি ধারকটিতে প্রাথমিক উপাদানটির ঠিক ঠিক মত ঠিকানা দেয় &something.front()। এই সদস্য ফাংশনের সুবিধাটি হ'ল ধারকটি খালি থাকলেও এটি কল করা ঠিক।


103
গুরুত্বপূর্ণ সতর্কতা vector<bool>এই উত্তরটির ব্যতিক্রম (এবং এর সমপরিমাণ মেমরির সঞ্চয়স্থান নেই bool) storage
মোটি

18
উজ্জ্বল দিক থেকে, সাবধান হওয়ার মতো খুব বেশি কিছু নেই: এই তিনটি পদ্ধতিরই সংকলন করতে ব্যর্থ হবে std::vector<bool>কারণ std::vector<bool>প্রক্সি অবজেক্টের ব্যবহার প্রয়োজন এবং সেই প্রক্সিটি স্পষ্টতই একটিতে রূপান্তরিত হতে পারে না bool*। এটির জন্য কার্যকর হিসাবে, যদি আপনার কোনও সিকোয়েন্সের প্রয়োজন হয় তবে boolএটি ব্যবহার করা ভাল std::vector<char>। @ মট্টি
জেমস ম্যাকনেলিস

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

7
বিস্তৃত হওয়ার জন্য তবে মূলত এর জন্য .data()- আমি কেবল ভান করব আমি সেই কুৎসিতটি দেখিনি &*iterator: পি
আন্ডারস্কোর_১

2
পয়েন্টারটি আর কতক্ষণ data()লাইভ থেকে ফিরে আসবে ? যদি ভেক্টরটিকে কখনও বৃহত্তর বা ছোট আকারে পরিবর্তন করা না হয় (এর মাধ্যমে push_back()বা অন্যান্য ক্রিয়াকলাপগুলি সহ reserve) তবে সঠিকভাবে নির্দেশ করে পয়েন্টারটি যতক্ষণ ভেক্টর বেঁচে থাকবে ততক্ষণ বেঁচে থাকবে তা কি নিশ্চিত?
জনবেকার্স

81

something.data() ভেক্টরের ডেটা স্পেসে একটি পয়েন্টার ফিরিয়ে দেবে।


error C2039: 'data' : is not a member of 'std::vector<_Ty>'
রুকি

2
@ রুকি: দেখে মনে হচ্ছে আপনি ভাঙা সংকলকটি ব্যবহার করছেন - সি ++ স্পেক্টে 23.3.6.3 ভেক্টর :: ডেটা সংজ্ঞায়িত করে। আপনার বিক্রেতার সাথে একটি বাগ ফাইল করার চেষ্টা করুন বা আরও ভাল সংকলক পাওয়ার চেষ্টা করুন।
ক্রিস ডড

1
@ ক্রিস ডড আমি একই ত্রুটি করেছি। আমি ভিসুয়াল স্টুডিও 2008 ব্যবহার করছি
bodacydo

34
@ ক্রিসডোড্ড: vector::data()সি ++ এ নতুন 11
হাইকম্যান্ডার

আমি ভিজ্যুয়াল স্টুডিও 2012 ব্যবহার করি এবং তারা অবশ্যই ভেক্টর :: ডেটা () যুক্ত করেছে কারণ আমি এটি একটি গুচ্ছ ব্যবহার করি।
রবার্ট স্নাইডার

12

পরিবর্তে প্রথম উপাদানটিতে একটি পয়েন্টার নিন:

process_data (&something [0]);

আমি ভেবেছিলাম এটি সাবস্ক্রিপ্ট বন্ধনী ছাড়াই প্রথম আইটেমটির মেমরি ঠিকানাটি ফেরত দেবে?
টিম

এটি অ্যারেগুলির জন্য, ভেক্টরগুলির জন্য নয়।
স্টিভন ডন

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