আমি কীভাবে একটি সি ++ ভেক্টরকে বিপরীত করব?


144

কোনও ভেক্টরকে জায়গায় রেখে উল্টাতে সি ++ তে কি বিল্ট-ইন ভেক্টর ফাংশন রয়েছে?

অথবা আপনি নিজেই এটি করতে হবে?

উত্তর:


251

এই উদ্দেশ্যে শিরোনামে একটি ফাংশন std::reverseরয়েছে algorithm

#include <vector>
#include <algorithm>

int main() {
  std::vector<int> a;
  std::reverse(a.begin(), a.end());
  return 0;
}

আপনি কীভাবে ভেক্টরগুলির ভেক্টরকে বিপরীত করবেন তা ব্যাখ্যা করতে পারেন? আমি v [0] কে [v.size () - 1] দিয়ে অদলবদল করতে চাই এবং ভি [0] [i] উপাদানটির ক্রমটি যেমন রয়েছে তেমন থেকে যায়। এটি সারিগুলির ক্রম পরিবর্তন করার অনুরূপ (যদি কোনও ভেক্টরকে ম্যাট্রিক্স হিসাবে দেখা হয়)। যদি কোনও ভেক্টরকে সংজ্ঞায়িত করা হয়: ভেক্টর <ভেক্টর <int>> ভি; বিপরীত (v.begin (), v.end ()) এটি বিপরীত হয় না। টিয়া!
বিকাশ গোয়েল

@ ভিকাসগোয়েল আসলে আপনার প্রস্তাবিত স্নিপেটটি কাজ করা উচিত। অন্য কিছু সমস্যা হতে পারে?
Ivaylo স্ট্রান্ডজেভ

45

সমস্ত পাত্রে তাদের সামগ্রী এবং এর সাথে একটি বিপরীত দৃশ্য সরবরাহ করে । এই দুটি ফাংশন তাই-কলগুলি বিপরীত পুনরাবৃত্তির প্রত্যাবর্তন করে , যা সাধারণের মতো ব্যবহার করা যেতে পারে, তবে এটি ধারকটি আসলে বিপরীত হয়েছে বলে মনে হবে।rbegin()rend()

#include <vector>
#include <iostream>

template<class InIt>
void print_range(InIt first, InIt last, char const* delim = "\n"){
  --last;
  for(; first != last; ++first){
    std::cout << *first << delim;
  }
  std::cout << *first;
}

int main(){
  int a[] = { 1, 2, 3, 4, 5 };
  std::vector<int> v(a, a+5);
  print_range(v.begin(), v.end(), "->");
  std::cout << "\n=============\n";
  print_range(v.rbegin(), v.rend(), "<-");
}

আইডিয়নে লাইভ উদাহরণ । আউটপুট:

1->2->3->4->5
=============
5<-4<-3<-2<-1

1
এটি তবে জায়গায় ভেক্টরটিকে বিপরীত করে না। আপনি std :: vector <T> v2 (v1.rbegin (), v1.rend ()) দিয়ে একটি নতুন ভেক্টর তৈরি করতে পারেন; v2.swap (v1 এ); যা কার্যকরভাবে আপনার সমাধানটি ব্যবহার করবে। Std :: বিপরীতভাবে ব্যবহার করার ক্ষেত্রে কোনও উপায়ে এটি কীভাবে আরও মার্জিত বা সুবিধাজনক তা আমি দেখতে পাচ্ছি না।
ক্যাশকো

17
@ ক্যাশকো: ওয়েল, একটির জন্য এটি একটি অপ-অফ, এটি ও (1)। বিপরীতমুখী .. এত বেশি না। বেশিরভাগ সময়, আপনার সত্যিকার অর্থে বিপরীত ধারক প্রয়োজন হয় না, আপনাকে কেবল এটি বিপরীত হিসাবে দেখতে হবে। আসলে, আমি এমন পরিস্থিতিতে ভাবতে পারি না যেখানে আপনার আসলে একটি বিপরীত ধারক প্রয়োজন যা বিপরীত পুনরুক্তি দিয়ে সমাধান করা যায় না।
Xoo

4
@ ক্যাশকো: কমনীয়তা সর্বদা সত্য কমনীয়তা হয় না। আমার পেশাগত জীবনের বেশিরভাগ ক্ষেত্রে আমার কেবল বিপরীত দৃষ্টিভঙ্গি দরকার, তবে বিপরীত ভেক্টর নয় not এবং এই সমস্ত ক্ষেত্রে, যদি আপনি আরও অনুলিপি তৈরি করতে বা ক্রমকে রূপান্তর করতে চান তবে পারফরম্যান্স সম্পূর্ণ অযাচিত হয়ে পড়বে। আপনি কি std::sort1000 টি উপাদান ভেক্টর, যদি আপনার কেবল অনির্ধারিত ক্রমে শীর্ষ -10 প্রয়োজন, কারণ এটি এর চেয়ে আরও মার্জিত std::partition? এটি এমন চিন্তাভাবনার স্কুল যা আমার পিসি অভিজ্ঞতাটিকে পঙ্গু করে তোলে যেমনটি 15 বছর আগে হয়েছিল, তবুও আরও অনেক চক্র নষ্ট হয়ে গেছে তার পার্থক্য নিয়ে with
সেবাস্তিয়ান মাচ

print_rangeসঠিক নয়: খালি পরিসরটি পাস করার পরে এটি কাজ করবে না ।
নওয়াজ

তাহলে বড় প্রশ্ন হচ্ছে, কী করবে std::reverse(a.rbegin(), a.rend())? ;।)
অরওয়েলফিল

23

আপনি ব্যবহার করতে পারেন std::reverseএই মত

std::reverse(str.begin(), str.end());

5
দুই মিনিটের ব্যবধানটি এটি আশ্চর্যজনক।
jww

2

আপনি std::listপরিবর্তে ব্যবহার করতে পারেন std::vector। বিপরীত উপাদানগুলির জন্য listএকটি অন্তর্নির্মিত ফাংশন তালিকা :: বিপরীত


3
ক্রম অনুসারে অনেক উপাদান স্বেচ্ছাসেবক অবস্থানে সন্নিবেশ করার একমাত্র নির্দিষ্ট ক্ষেত্রে ভেট্টারের তুলনায় স্ট্যান্ড :: তালিকাটি পছন্দ করা উচিত। স্টাড :: ভেক্টরের উপরে তালিকাটি ব্যবহার করা কেবলমাত্র কারণটি আপনার ক্রমটিকে বিপরীত করবে একটি খারাপ ধারণা কর্মক্ষমতা অনুযায়ী।
ইজড

0

প্রায়শই আপনি ভেক্টরটিকে বিপরীত করতে চান কারণ হ'ল আপনি সমস্ত আইটেমটি শেষে চাপিয়ে দিয়েছিলেন তবে বাস্তবে সেগুলি বিপরীত ক্রমে পেয়েছিলেন। সেক্ষেত্রে আপনি dequeপরিবর্তে ব্যবহার করে এবং সরাসরি সম্মুখ দিকে ঠেলা দিয়ে আপনি ধারকটিকে বিপরীত করতে পারেন । (অথবা আপনি এর vector::insert()পরিবর্তে সামনের আইটেমগুলি সন্নিবেশ করতে পারেন , তবে প্রচুর আইটেম থাকলে তা ধীর হবে কারণ এটি প্রতিটি সন্নিবেশের জন্য অন্যান্য সমস্ত আইটেমগুলিকে বদলাতে হবে to) সুতরাং বিপরীতে:

std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
    foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());

পরিবর্তে আপনি এটি করতে পারেন:

std::deque<int> foo;
int nextItem;
while (getNext(nextItem)) {
    foo.push_front(nextItem);
}
// No reverse needed - already in correct order

0
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
    vector<int>v1;
    for(int i=0; i<5; i++)
        v1.push_back(i*2);
    for(int i=0; i<v1.size(); i++)
        cout<<v1[i];    //02468
    reverse(v1.begin(),v1.end());
    
    for(int i=0; i<v1.size(); i++)
        cout<<v1[i];   //86420
}

1
আট বছরের পুরানো এই প্রশ্নের কি আর কোনও সদৃশ জবাব দরকার যা এতে কিছুই যুক্ত হয় না?
ব্লাস্টফর্নেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.