অযোগ্যতাযুক্ত বাছাই () - কেন এটি স্ট্যান্ড :: ভেক্টর ব্যবহার করে এবং এসটিডি :: অ্যারে ব্যবহার না করে সংকলিত হয় এবং কোন সংকলকটি সঠিক?


11

যখন কলিং std::sort()একটি উপর std::array:

#include <vector>
#include <array>
#include <algorithm>

int main() {
    std::vector<int> foo{4, 1, 2, 3};
    sort(begin(foo), end(foo));

    std::array<int, 4> foo2{4, 1, 2, 3};
    sort(begin(foo2), end(foo2));
}

জিসিসি এবং ক্ল্যাং উভয়ই সাজানোর ক্ষেত্রে ত্রুটি দেয় std::array- ক্ল্যাং বলে

ত্রুটি: অঘোষিত শনাক্তকারী 'সাজানোর' ব্যবহার; আপনার মানে 'স্টাডি :: সাজানো'?

সমস্যার std::sort(begin(foo2), end(foo2))সমাধান করতে পরিবর্তন করা হচ্ছে ।

এমএসভিসি লিখিত হিসাবে উপরের কোডটি সংকলন করে।

কেন মধ্যবর্তী চিকিৎসায় পার্থক্য std::vectorএবং std::array; এবং কোন সংকলক সঠিক?


sort(...-> std::sort(...। আমার ধারণা , এডিএল (যুক্তি নির্ভর নির্ভরতা) যা আপনাকে ট্রিপ করছে। যে, বা ছাড়ের গাইড। যে কোনো ক্ষেত্রে; আপনি যে ফাংশনগুলি কল করেন তা সর্বদা যোগ্যতা অর্জন করুন।
জেস্পার জুহল

3
এমএসভিসি লাইব্রেরিতে এমন কিছু বিশেষীকরণ থাকতে পারে যা যুক্তি-নির্ভর দৃষ্টিভঙ্গির std::sortদিকে পরিচালিত করে (যেমন আপনি ইতিমধ্যে পেয়েছেন এবং )? std::beginstd::end
কিছু প্রোগ্রামার 18 শে

1
@ সোপমপ্রগ্রামমারডুড এটি কেবল সহজ যে ভিসি ++ এর স্টাডলিবের সমস্ত পাত্রে এমন একটি শ্রেণীর ধরণের পুনরাবৃত্তির ব্যবহার করা হয়েছে namespace stdযেখানে সাধারণ পয়েন্টার টাইপটি কাজ করত। আমি বিশ্বাস করি যে এটি অতিরিক্ত কাজগুলি এবং অন্যান্য সাধারণ ত্রুটিগুলি সনাক্ত করতে ডিবাগ-বিল্ড চেক সন্নিবেশ করানো।
ফ্রান্সোইস অ্যান্ডরিয়াক

উত্তর:


16

এটি সেই ধরণের উপরে নেমে আসে beginএবং endফলাফলটি কীভাবে আর্গুমেন্ট ডিপেন্ডেন্ট লুকআপের সাথে কাজ করে

ভিতরে

sort(begin(foo), end(foo));

তুমি পাও

sort(std::vector<int>::iterator, std::vector<int>::iterator)

এবং যেহেতু এডিএল এর std::vector<int>::iteratorএকটি সদস্য stdখুঁজে পানsort করে stdএবং কলটি সফল হয়।

সঙ্গে

sort(begin(foo2), end(foo2));

তুমি পাও

sort(int*, int*)

এবং int*সদস্য না হওয়ায় stdএডিএল এটি দেখবে নাstd এবং আপনি এটি পাচ্ছেন না std::sort

এটি এমএসভিসিতে কাজ করে কারণ

sort(begin(foo2), end(foo2));

হয়ে

sort(std::_Array_iterator, std::_Array_iterator)

এবং যেহেতু এডিএল সন্ধানের std::_Array_iteratorঅংশstdsort

উভয় সংকলকই এই আচরণের সাথে সঠিক। std::vectorএবং আইটিরেটারেরstd::array জন্য কী ধরণের ব্যবহৃত হবে সে সম্পর্কে কোনও প্রয়োজন নেই কেবলমাত্র এটি লেগ্যাসি র্যান্ডমএ্যাক্সেসিটরের প্রয়োজনীয়তা পূরণ করে এবং এর জন্য C ++ 17 std::arrayএ টাইপটি একটি ল্যাটারাল টাইপ এবং সি ++ ২০ তেও রয়েছে যে এটি কনটেক্সপ্রেশিটার হতে পারে


1
আমি অনুমান করি যে প্রশ্নটি এমএসভিসির আচরণের সাথে সঙ্গতিপূর্ণ কিনা, অর্থাৎ std::arrayপুনরাবৃত্তিকারীকে থাকতে হবে int*বা এটি কোনও শ্রেণির ধরণ হতে পারে? একইভাবে std::vectorএটির ক্ষেত্রেও প্রশ্নটির সাথে প্রাসঙ্গিক হবে যে এডিএলটি কোনও শ্রেণিবদ্ধ হতে হবে যার উপর ADL কাজ করবে, বা এটি int*পাশাপাশি হতে পারে কিনা ।
আখরোট

@ ওয়ালান্ট এটি বাস্তবায়ন যা যা চায় তা হতে পারে। এটি একটি std::iterator, অন্য কিছু বা কেবল পয়েন্টার হতে পারে ।
নাথান অলিভার

1
আমি আরও আশ্চর্য হয়েছি যে কেন এই লাইব্রেরি বাস্তবায়নে তারা ব্যবহারের int*জন্য বেছে নিয়েছিল std::arrayতবে তা নয় std::vector
ফ্রেঞ্চোইস অ্যান্ডরিয়াকস

1
উভয়ের জন্য পুনরাবৃত্তকারী প্রকার std::arrayএবং std::vectorঅনির্দিষ্ট, অর্থাত বাস্তবায়নের মাধ্যমে তাদের কাঁচা পয়েন্টার (কোডটি সংকলন করবে না) বা শ্রেণি-প্রকারের মোড়ক হিসাবে কোড সংজ্ঞায়িত করার অনুমতি দেওয়া হয় (কোডটি কেবল তখনই সংকলিত হবে যখন শ্রেণীর প্রকারের সাথে stdADL সম্পর্কিত নেমস্পেস রয়েছে)।
aschepler

1
এখানে একটি ডেমো রয়েছে যেখানে এডিএল একটি উপাধীর সাথে ব্যর্থ হয় এবং এখানে একটি ডেমো রয়েছে যেখানে এডিএল কোনও নেস্টেড ক্লাসে সফল হয়। এখানে এবং আমার আগের পরীক্ষাগুলিতে উভয়ই std::vector<T>::iteratorএকটি উপনাম।
ব্যবহারকারী 2357112
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.