অ্যারেটিকে ভেক্টরে রূপান্তর করার সহজ উপায় কী?


94

অ্যারেটিকে ভেক্টরে রূপান্তর করার সহজ উপায় কী?

void test(vector<int> _array)
{
  ...
}

int x[3]={1, 2, 3};
test(x); // Syntax error.

আমি এক্সকে সহজ উপায়ে ইনট অ্যারে থেকে ভেক্টরে রূপান্তর করতে চাই।

উত্তর:


140

vectorদুটি পুনরুক্তিকারী কনস্ট্রাক্টরটি ব্যবহার করুন , পয়েন্টারগুলি বৈধ পুনরাবৃত্তকারী রয়েছে তা নোট করুন এবং অ্যারে থেকে পয়েন্টারে রূপান্তরিত রূপান্তরটি ব্যবহার করুন:

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + sizeof x / sizeof x[0]);
test(v);

বা

test(std::vector<int>(x, x + sizeof x / sizeof x[0]));

sizeof x / sizeof x[0]স্পষ্টতই 3এই প্রসঙ্গে কোথায় ; এটি অ্যারেতে উপাদানের সংখ্যা পাওয়ার সাধারণ উপায়। লক্ষ্য করুন x + sizeof x / sizeof x[0]এক উপাদান পয়েন্ট অতিক্রম শেষ উপাদান।


4
আপনি দয়া করে এটি ব্যাখ্যা করতে পারেন? আমি ইতিমধ্যে পড়তে vector<int> a(5,10);গড় make room for 5 int` এবং তাদের 10. কিন্তু কিভাবে আপনার এক্স, এক্স ... কাজের সঙ্গে আরম্ভ? তুমি কি ব্যাখ্যা করতে পারো?
আসিফ মোশতাক

4
@ অজানা নির্বাচন করার পরিবর্তে vector<int>::vector(size_type, int), এটি নির্বাচন করে vector<int>::vector(int*, int*), যা সেই জোড় পয়েন্টার দ্বারা চিহ্নিত রেঞ্জটিকে অনুলিপি করে। প্রথম জমিদার (2), দ্বিতীয় জমিদার (4) হয় এখানে
Caleth

4
সি ++ এ 11 ম এর :: মাপের পদ্ধতির চেয়ে পরিধি আরও ভাল। sizeof x / sizeof x[0] == std::extent<decltype(x)>::value
আইজাক পাসকুল

116

ব্যক্তিগতভাবে, আমি বেশিরভাগ সি +++ পদ্ধতির পছন্দ করি কারণ এটির জন্য আপনাকে sizeof()আর অ্যারে বাউন্ডস সামঞ্জস্য করার প্রয়োজন হয় না এবং আপনি চাইলে সি ++ 2003-এ প্রাসঙ্গিক ফাংশনটিও সংজ্ঞায়িত করতে পারেন too ):

#include <iterator>
#include <vector>
int x[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(std::begin(x), std::end(x));

স্পষ্টতই, সি ++ ২০১১ এর সাথে আপনি যে কোনও উপায়ে আরম্ভকারী তালিকা ব্যবহার করতে চাইতে পারেন:

std::vector<int> v({ 1, 2, 3, 4, 5 });

4
এটি অ্যারে অনুলিপি করে বা এটি কেবল এটি দেখায়? আমি পারফরম্যান্স নিয়ে উদ্বিগ্ন
kirill_igum

4
std::vector<T>সর্বদা Tঅবজেক্টের মালিক । এটিতে দুটি বিষয় অন্তর্ভুক্ত রয়েছে: যখন কোনও ভেক্টরে কোনও বস্তু সন্নিবেশ করা হয় সেগুলি অনুলিপি করা হয় এবং এগুলি মেমোরিতে সংঘবদ্ধ হয়। যুক্তিসঙ্গত ছোট ছোট বস্তুর জন্য, যেমন ছোট স্ট্রিংয়ের ক্রম, সংঘটন একটি বড় কার্যকারিতা লাভ। যদি আপনার বিষয়গুলি অনুলিপি করা বড় এবং ব্যয়বহুল হয় তবে আপনি অবজেক্টগুলিতে [কোনওভাবে সংস্থানিত পরিচালিত] পয়েন্টার সংরক্ষণ করতে পারেন store কোন পদ্ধতিটি আরও দক্ষ তা বস্তুর উপর নির্ভর করে তবে আপনার পছন্দ আছে।
ডায়েটমার কাহল

সুতরাং আমি যদি একটি সি ++ এবং এসি গ্রন্থাগার ইন্টারফেস করতে চাই এবং সি-অ্যারে থেকে ভেক্টর এবং পিছনে অনুলিপি করতে চাই, তবে 2 কপির জরিমানা দেওয়ার কোনও উপায় নেই? (আমি ইগেন লাইব্রেরি এবং জিএসএল ব্যবহার করছি)
কিরিল_গুম

16

পয়েন্টারগুলি অন্য কোনও পুনরাবৃত্তির মতো ব্যবহার করা যেতে পারে:

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)

4
বাস্তব জীবনে আপনি অ্যারের আকারটি বিমূর্ত করতে চাইতে পারেন, উদাহরণস্বরূপ const size_t X_SIZE = 3;অ্যারের আকারটি চিহ্নিত করার জন্য ব্যবহার করা বা আকার থেকে এটি গণনা করতে। পঠনযোগ্যতার জন্য আমি সেই অংশটি বাদ দিয়েছি।
রাফাł রাউকি

11

আপনি এখানে ভুল প্রশ্ন জিজ্ঞাসা করছেন - সব কিছু ভেক্টরে জোর করে না দিয়ে জিজ্ঞাসা করুন আপনি কীভাবে নির্দিষ্ট ধারকটির পরিবর্তে পুনরায় পুনরায় পুনরায় শ্রোতার সাথে কাজ করতে পরীক্ষা পরিবর্তন করতে পারেন can সামঞ্জস্যতা ধরে রাখতে আপনি ওভারলোড সরবরাহ করতে পারেন (এবং একই সাথে অন্যান্য পাত্রে বিনামূল্যে একই সাথে পরিচালনা করতে পারেন):

void test(const std::vector<int>& in) {
  // Iterate over vector and do whatever
}

হয়ে:

template <typename Iterator>
void test(Iterator begin, const Iterator end) {
    // Iterate over range and do whatever
}

template <typename Container>
void test(const Container& in) {
    test(std::begin(in), std::end(in));
}

যা আপনাকে করতে দেয়:

int x[3]={1, 2, 3};
test(x); // Now correct

( আইডিয়ন ডেমো )


"সবকিছু ভেক্টরে জোর করে না দিয়ে জিজ্ঞাসা করুন আপনি কীভাবে কোনও নির্দিষ্ট ধারকের পরিবর্তে পুনরায় পুনরায় শ্রোতার সাথে কাজ করতে পরীক্ষাকে রূপান্তর করতে পারেন" " কেন এই ভাল?
জলজন্তু

4
@ অ্যাকার্ড্টার্টল কারণ এখন, কেবলমাত্র ভেক্টরকে সমর্থন করার পরিবর্তে আপনি তালিকাগুলি এবং অ্যারে সমর্থন করেন এবং ধারকগুলিকে উত্সাহিত করেন এবং পুনরাবৃত্তকারী এবং ব্যাপ্তিগুলি রূপান্তর করেন এবং ....
ফ্লেক্সো

4
এবং আপনার ডেটা অনুলিপি করার দরকার
পড়েনি

2

একটি সহজ উপায় ক্লাসে assign()পূর্বনির্ধারিত ফাংশনের ব্যবহার হতে পারে vector

যেমন

array[5]={1,2,3,4,5};

vector<int> v;
v.assign(array, array+5); // 5 is size of array.

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