C ++ 벡터를 어떻게 되돌 립니까?


144

C ++에 벡터를 뒤집는 내장 벡터 함수가 있습니까?

아니면 수동으로해야합니까?

답변:


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 [v.size ()-1]과 바꾸고 v [0] [i] 요소의 순서는 그대로 유지하려고합니다. 이것은 행 순서 변경과 유사합니다 (벡터가 행렬로 표시되는 경우). 벡터가 다음과 같이 정의 된 경우 : vector <vector <int>> v; reverse (v.begin (), v.end ())는 반대로하지 않습니다. 티아!
Vikas Goel

@VikasGoel 사실 제안하는 스 니펫이 작동해야합니다. 다른 문제가 있습니까?
Ivaylo Strandjev

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(), "<-");
}

Ideone에 대한 실제 예 . 산출:

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

1
그러나 벡터를 그 자리에서 뒤집지 않습니다. std :: vector <T> v2 (v1.rbegin (), v1.rend ()); v2. 스왑 (v1); 효과적으로 솔루션을 사용합니다. std :: reverse를 사용하는 것이 어떤 식으로 더 우아하거나 유리한지 알 수 없습니다.
CashCow

17
@CashCow : 글쎄, 하나의, 그것은 no-op, 그것은 O (1)입니다. 역전 ..별로. 대부분의 경우 실제로 역 컨테이너가 필요하지 않으며 역 컨테이너로 필요가 있습니다 . 실제로 리버스 반복자로 해결할 수없는 리버스 컨테이너가 실제로 필요한 상황은 생각할 수 없습니다.
Xeo

4
@CashCow : 우아함이 항상 진정한 우아함은 아닙니다. 대부분의 경우 전문 경력에서 역전 된 모습은 필요했지만 역전 된 벡터는 필요하지 않았습니다. 이러한 모든 경우에 더 많은 사본을 만들거나 순서를 바꾸면 성능이 전혀 필요하지 않습니다. std::sort지정되지 않은 순서로 상위 10을 필요로한다면 1000 요소 벡터 도 필요 std::partition합니까? 이것은 15 년 전과 마찬가지로 오늘날 내 PC 경험을 망쳐 놓은 것으로 생각되는 학교입니다.
Sebastian Mach

print_range빈 공간 이 지났을 때 작동하지 않습니다 .
Nawaz

큰 문제는 무엇을 std::reverse(a.rbegin(), a.rend())할 것인가입니다. ; ^)
Orwellophile 1

23

당신이 사용할 수있는 std::reverse다음과 같은

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

5
2 분의 차이가 놀랍습니다.
jww

2

std::list대신에 사용할 수도 있습니다 std::vector. 요소 반전을 위한 list내장 기능 목록 :: 역 이 있습니다.


3
std :: list는 시퀀스에서 임의의 위치에 많은 요소를 삽입하는 경우에만 벡터보다 선호되어야합니다. 시퀀스를 반대로 할 것이기 때문에 벡터보다 std :: list를 사용하는 것은 성능 측면에서 나쁜 생각입니다.
eozd

0

종종 벡터를 뒤집 으려는 이유는 마지막에 모든 항목을 밀어서 벡터를 채우지 만 실제로는 역순으로 받기 때문입니다. 이 경우 deque대신 대신 컨테이너를 앞쪽으로 밀어 컨테이너를 뒤집을 수 있습니다 . (또는 vector::insert()대신 전면에 항목을 삽입 할 수 있지만 삽입 할 때마다 다른 모든 항목을 섞어 야하기 때문에 항목이 많은 경우 속도가 느려집니다.)

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
이 8 살짜리 질문에는 아무것도 추가하지 않는 또 다른 중복 답변이 필요합니까?
용광로
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.