এসটিডি :: ভেক্টর উপাদানগুলি কি সংলগ্ন হওয়ার গ্যারান্টিযুক্ত?


111

আমার প্রশ্নটি সহজ: এসটিডি :: ভেক্টর উপাদানগুলি সংলগ্ন হওয়ার গ্যারান্টিযুক্ত? ক্রম শব্দে, আমি সিডি-অ্যারে হিসাবে স্টাড :: ভেক্টরের প্রথম উপাদানটির পয়েন্টারটি ব্যবহার করতে পারি?

যদি আমার স্মৃতি আমাকে ভালভাবে পরিবেশন করে, সি ++ মান এমন গ্যারান্টি দেয় না। তবে, স্টাড :: ভেক্টরের প্রয়োজনীয়তাগুলি এমন ছিল যে উপাদানগুলি সংঞ্জল না হলে তাদের সাথে মিলিত হওয়া কার্যত অসম্ভব ছিল।

কেউ কি এই ব্যাখ্যা করতে পারেন?

উদাহরণ:

std::vector<int> values;
// ... fill up values

if( !values.empty() )
{
    int *array = &values[0];
    for( int i = 0; i < values.size(); ++i )
    {
        int v = array[i];
        // do something with 'v'
    }
}

আমি জানি যে আপনি যদি valuesএই ifব্লকের ভিতরে পরিবর্তন করেন তবে আপনি সমস্যায় পড়েছেন । আমি আপনার প্রশ্নের উত্তর জানি না, যদিও আমি কেবল একটি মন্তব্য করছি। :)
গ্রেগ ডি

@ গ্রেগ: কি সমস্যা - আপনি কি একটু বিস্তারিত বলতে পারবেন?
রুনুনেন

আমি মনে করি তার অর্থ হ'ল নতুন মানগুলিকে চাপ দেওয়া "রিলোক" কে ট্রিগার করতে পারে যার ফলে অ্যারেটি অবৈধ হয়ে উঠবে।
মার্টিন কোট

valuesপরিবর্তিত কলগুলি , বিশেষত এটির আকার পরিবর্তন করে (উদাঃ push_back()), অন্তর্নিহিত ভেক্টরটির পুনর্নির্দেশের অনুরোধ জানাতে পারে যা অনুলিপি করা পয়েন্টারটিকে অকার্যকর করে দেয় array। এটি ভেক্টর ব্যবহার করার পিছনে একই নীতিটি :: ভেক্টরটিতে পয়েন্টারের পরিবর্তে পুনরাবৃত্তকারী। :)
গ্রেগ ডি

1
হ্যাঁ, আমি এটি পরিষ্কার করার চেষ্টা করার জন্য আমি এর মানগুলির চারপাশে রেখেছি, আমি নিজেই শ্রেণীর কথা বলছিলাম, এর মধ্যে থাকা মানগুলি নয়। :) দুর্ভাগ্যজনক নামকরণ এবং এগুলি। আমি মনে করি না যে এটি সাধারণ ক্ষেত্রে এটি সত্যিই একটি সমস্যা যেখানে এই প্রশ্নটি প্রাসঙ্গিক - কেন কেউ মেমোরিটির কোনও পয়েন্টার ধরে ফেলবে, তারপরে পয়েন্টারটি ব্যবহার না করে ভেক্টরের সাথে মকিং শুরু করবে? মূর্খতা।
গ্রেগ ডি

উত্তর:


118

এটি সি ++ 98 স্ট্যান্ডার্ড যথাযথ থেকে মিস করা হয়েছিল তবে পরে এটি টিআর এর অংশ হিসাবে যুক্ত হয়েছিল। আসন্ন সি ++ 0 এক্স স্ট্যান্ডার্ড অবশ্যই প্রয়োজন হিসাবে এটি ধারণ করবে।

N2798 থেকে (সি ++ 0x এর খসড়া):

23.2.6 ক্লাস টেম্পলেট ভেক্টর [ভেক্টর]

1 ভেক্টর একটি ক্রম ধারক যা এলোমেলো অ্যাক্সেস পুনরাবৃত্তিকে সমর্থন করে। তদতিরিক্ত, এটি ধীরে ধীরে সময় সন্নিবেশ এবং ক্রিয়াকলাপগুলি মুছে ফেলার (এমওরাইটিজড) সমর্থন করে; সন্নিবেশ করুন এবং মাঝখানে মুছুন লিনিয়ার সময় নিন। স্টোরেজ ম্যানেজমেন্ট স্বয়ংক্রিয়ভাবে পরিচালিত হয়, যদিও দক্ষতা উন্নত করার জন্য ইঙ্গিত দেওয়া যেতে পারে। কোনও ভেক্টরের উপাদানগুলি স্বচ্ছভাবে সংরক্ষণ করা হয়, এর অর্থ হ'ল যদি ভি কোনও ভেক্টর যেখানে টি বুল ব্যতীত অন্য ধরণের থাকে তবে এটি সনাক্ত করে & v [n] == & v [0] + n সমস্ত 0 <= n <v ফাইলের আকার ()।


3
এটি আইএসও 14882, দ্বিতীয় সংস্করণেও বলা হয়েছে: বিভাগ 23.2.4 [lib.vector]: "একটি ভেক্টরের উপাদানগুলি স্বচ্ছভাবে সংরক্ষণ করা হয়, যার অর্থ v যদি ভেক্টর থাকে <টি, বরাদ্দকারী> যেখানে টি বাদে অন্য ধরণের হয় বুল, তারপরে এটি পরিচয় & v [n] == & v [0] + n সকল 0 <= n <v.size () এর জন্য মেনে চলে ""
মাইক ক্যারন

4
সুতরাং, টিআর, টিসি, :) আসলে সি ++ 03 কে আমি যা পড়েছি তা থেকে সি ++ 98-টিসি 1 (প্রযুক্তিগত করিয়েনডাম) বলা হয়
জোহানেস স্কাউব - লিটব

2
ভেক্টর ভেক্টর সম্পর্কে কি? শেষ ভেক্টরগুলি শেষ দলের অভ্যন্তরীণ ভেক্টরগুলির পরে ঠিক?
huseyin tugrul buyukisik

1
@ শুইয়েন তুগরুল বাইউইসিসিক আপনি কি এর উত্তর শিখেছেন? এটি কীভাবে কাজ করে তা আমিও ভাবছি
ডেভিড ডরিয়া

1
@ জুসেইন তুগরুল বাইউকিসিক এটি অবশ্যই সত্য, তবে এটি পরবর্তী ঘটনাগুলির সাথে std::vectorসামঞ্জস্যপূর্ণ। উদাহরণস্বরূপ: std::vector<std::vector<int>> vউপাদানগুলিতে v[0],, v[1]... মেমরির পরে সংরক্ষণ করা হয়, কিন্তু উপাদান v[0].back()এবং এটির v[1].front()গ্যারান্টি নেই।
জারজেক

27

অন্যান্য উত্তরগুলি যেমন উল্লেখ করেছে যে, কোনও ভেক্টরের সামগ্রীগুলি অবিচ্ছিন্ন (বুলের অদ্ভুততা বাদে) গ্যারান্টিযুক্ত।

আমি যে মন্তব্যটি যুক্ত করতে চেয়েছিলাম, তা হ'ল যদি আপনি কোনও সেক্টর সন্নিবেশ করান বা ভেক্টরে মুছে ফেলেন, যা ভেক্টরটির স্মৃতি পুনরুক্ত করে দিতে পারে, তবে আপনি আপনার সমস্ত সংরক্ষিত পয়েন্টার এবং পুনরুক্তিগুলিকে অবৈধ করে দেবেন।


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

2
তবে বিদ্যমান পয়েন্টার এবং পুনরুক্তিগুলি অবৈধ হবে।
বিল লিঞ্চ

ভাল যুক্তি. আপনি কী বোঝাতে চেয়েছেন তা স্পষ্ট করার জন্য আপনার উত্তরটি দেওয়া উচিত।
ডিমা

আমাকে সবচেয়ে দরকারী উত্তর
CoffeDeveloper

আমি জানি যে গতকাল আমার প্রোগ্রামটি কেন সেগফাল্টিং করছিল, যখন আমি এটির মধ্য দিয়ে ডাবল লুপটিতে নির্দিষ্ট উপাদানগুলি সরিয়েছিলাম :) ধন্যবাদ!
ব্যবহারকারী 2891462

9

স্ট্যান্ডার্ডটি আসলে গ্যারান্টি দেয় যে একটি vectorস্মৃতিতে অবিচ্ছিন্ন এবং এটি কোনও ক্রিয়ায় &a[0]যেতে পারে Cযা অ্যারের প্রত্যাশা করে।

এই নিয়মের ব্যতিক্রম হ'ল vector<bool>এটি কেবলমাত্র প্রতি বিট ব্যবহার boolকরে যদিও এটির ধারাবাহিক স্মৃতি থাকে এটি একটি হিসাবে ব্যবহার করা যায় না bool*(এটি ব্যাপকভাবে একটি মিথ্যা অপ্টিমাইজেশন এবং একটি ভুল হিসাবে বিবেচিত)।

বিটিডাব্লু, আপনি কেন পুনরুক্তি ব্যবহার করবেন না? এটাই তাদের জন্য।


1
> বিটিডব্লিউ, আপনি কেন পুনরুক্তি ব্যবহার করবেন না? এটাই তাদের জন্য। সম্ভবত তিনি এই বিষয়টিতে আলেকানারেস্কুর নতুন পেপারটি পড়েছেন: বুস্টকন.সাইটিয়া
নেমানজা ত্রিফুনোভিক

এই লিঙ্কটির জন্য ধন্যবাদ, আমি এটি আমার পঠন তালিকায় আসব (আমি আলেকজান্দ্রেসুর নিবন্ধগুলি মিস করার চেষ্টা করব না)
মতি

মাওহাহা, সবাই মনে হয় আজকাল সেই উপস্থাপনাটি নিয়ে কথা বলছে। দেখুন, আলোচনাটি এখনও এটি সম্পর্কে উত্তপ্ত: গ্রুপ. google.com/group/comp.lang.c++.moderated/browse_thread/…
জোহানেস স্কাউব - লিটব

আপনি যদি এটি মনোযোগ সহকারে পড়েন, আলেকজান্দ্রেস্কুর নিবন্ধটি সত্যই "সি ++ তে পুনরায় ব্যবহার করবেন না" বলে না, এটি "চেক আউট ডি" বলে। তিনি এই গবেষণাপত্রে যে পদ্ধতির বর্ণনা করেছেন তা হ'ল বিদ্যমান ভাষা এবং কাঠামোগুলির মতো যা কার্যকরী heritageতিহ্যকে (লিস্ট, স্কিম, হাস্কেল) শোষিত করেছে এবং আমি এখনও গুরুত্ব দিয়ে সন্দেহ করি যে অন্য-সি-ভিত্তিক-সিনট্যাক্স আরও উন্নতমানের জন্য একটি আদর্শ সূচনা পয়েন্ট কিনা তালিকা পরিচালনা গত বছরের কিছু সময় আমি সংক্ষেপে তাকে তার পরিবর্তে সি # এর মতো প্রতিষ্ঠিত ভাষার উন্নতির দিকে তার যথেষ্ট দক্ষতার দিকে মনোনিবেশ করার জন্য প্ররোচিত করার চেষ্টা করেছি, তবে আমার সফলতার আশঙ্কা নেই! :)
ড্যানিয়েল আরউইকার

6

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

তবে এর ব্যতিক্রমও আছে !!

vector<bool>স্থান বাঁচানোর জন্য ডিজাইন করা একটি বিশেষায়িত বাস্তবায়ন রয়েছে, যাতে প্রতিটি বুল কেবল একটি বিট ব্যবহার করে। অন্তর্নিহিত অ্যারে vector<bool>যেভাবে কাজ vector<T>করবে না তার উপর বোল এবং অ্যারে পাটিগণিতের একটি সুসংগত অ্যারে নয় ।

(আমি মনে করি এটি ভেক্টরের কোনও বিশেষায়নের ক্ষেত্রেও সত্য হতে পারে, যেহেতু আমরা সর্বদা একটি নতুন বাস্তবায়ন করতে পারি However তবে, std::vector<bool>একমাত্র, ভুল, আদর্শ বিশেষজ্ঞ যা সাধারণ পয়েন্টার গাণিতিক কাজ করবে না))


ব্যবহারকারীর বিশেষজ্ঞকরণের অনুমতি নেই std::vectorএবং অন্যান্য সমস্ত ভেক্টরকে একযোগে স্টোরেজ ব্যবহার করতে হবে। অতএব, std::vector<bool>(ভাগ্যক্রমে) একমাত্র স্ট্যান্ডার্ড ভেক্টর যা অদ্ভুত। (আমি দৃ strongly়তার সাথে মতামত করছি যে এই বিশেষীকরণটি হ্রাস করা উচিত এবং প্রতিস্থাপন করা উচিত উদাহরণস্বরূপ std::dynamic_bitsetএটি একই কার্যকারিতা সহকারে It's এটি কোনও খারাপ ডেটা কাঠামো নয়, এটি কেবল কোনও ভেক্টর নয়))
আর্ন ভোগেল

3

আমি এই থ্রেডটি খুঁজে পেয়েছি কারণ আমার একটি ব্যবহারের কেস রয়েছে যেখানে ভোগ্য সংঘবদ্ধ মেমরি ব্যবহার করা সুবিধা।

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

void generate(std::vector<float> v)
{
  float f = generate_next_float();
  v.push_back(f);
}

এখন আমি ওপেনজিএল-এর বাফার-সম্পর্কিত ফাংশনগুলিতে অ্যারে হিসাবে ভেক্টরের ফ্লোটগুলি পাস করতে পারি। এটি অ্যারের দৈর্ঘ্য নির্ধারণ করতে আকারের প্রয়োজনীয়তাও সরিয়ে দেয়।

এটি ফ্লোটগুলি সঞ্চয় করার জন্য একটি বিশাল অ্যারের বরাদ্দ করা এবং আশা করে আমি এটি যথেষ্ট পরিমাণে বাড়িয়েছি, বা আমার নিজস্ব গতিশীল অ্যারে তৈরির তুলনায় এটি অনেক ভাল is


2
এই ফাংশনটি আমার কাছে কোনও অর্থবোধ করে না। আপনি কি vতার চেয়ে vনিজেকে একটি রেফারেন্স বা পয়েন্টার দিয়ে যাচ্ছেন? কারণ vএকা পাস করার ফলে ফাংশনের অভ্যন্তরে একটি অনুলিপি তৈরি করা হবে যা ফাংশন শেষ হওয়ার পরে অস্তিত্ব রুদ্ধ হবে। ফাংশন শেষ হয়ে গেলে আপনি কেবল ভেক্টরটিকে মুছতে ভেক্টরটিতে কিছু চাপ দিচ্ছেন।
জনবেকার্স 0

1

cplusplus.com:

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


1

হ্যাঁ, স্টাড :: ভেক্টরের উপাদানগুলি সামঞ্জস্যপূর্ণ হওয়ার গ্যারান্টিযুক্ত।


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