2011-09-20 3 views
3

출력을 터미널에 정렬하는 데 많은 문제가 있습니다. 나는 벡터의 벡터 벡터를 출력하고 싶은데, 여기서 myvec [i]는 터미널의 i 번째 행을 차지하고 출력에는 vector< vector<double> > myvec;이 출력된다. myvec을 구성하는 벡터의 크기는 3입니다.C++을 사용하여 터미널에 출력 정렬

이것이 인쇄 방법입니다.

for(unsigned int i=0; i<myvec.size() ; ++i ) 
{ 


cout<<myvec[i][0]<<"  " 
    <<myvec[i][1]<<"  " 
    <<myvec[i][2]<<'\n'; 
} 

출력 할 때 myvec [i] [0] 숫자 열만 제대로 정렬됩니다. 나머지 숫자는 지저분 해 보입니다. 이 출력을 정렬하는 좋은 방법이 있습니까? 당신은 당신이 원하는 최소 문자 수는 왼쪽에 데이터를 작성하고 left 출력되도록 설정하는 setw()을 사용할 수 있습니다

enter image description here

+0

탭을 사용하는 대신 공간 (\의 t) "". –

+0

우리는 이것에 대한 실제 스크린 샷이 정말로 필요합니까 ?? –

답변

6

(이미지의 라인 5 오른쪽에 인쇄 된 0.7 무시). 이처럼 :

cout << setw(8) << left << myvec[i][0]; 

이 공백으로 빈 공간을 채우기해야하지만 경우에, 당신은 할 수 있습니다 : 당신은 이것에 대한 #include <iomanip> 필요합니다

cout << setw(8) << left << setfill(' ') << myvec[i][0]; 

. 코드에 대한

+0

정말 고마워요! 그것은 저를 위해 좋게 작동했습니다. 하나의 질문 하나 setw()의 작업. myvec [i] [0]의 값이 2.71828이고'cout << setw (3) << left << myvec [i] [0];은 출력에 2.7이 출력된다는 것을 의미합니까? – smilingbuddha

+0

@GaurishTelang 'setw()'는 쓰여질 최소 문자 수를 설정합니다. – quasiverse

+0

기록 할 최대 문자 수를 설정하는 명령은 무엇입니까? – smilingbuddha

0

그냥 몇 가지 참고 사항 :

정렬 유형

quasiverse의 대답은 당신에게 왼쪽 정당성을 제공, 즉 모든 번호가 첫 번째 문자 위치에서 시작합니다. left을 삭제하면 오른쪽 맞춤이됩니다. 즉, 모든 숫자가 마지막 문자 위치에서 시작됩니다.

소수점 정렬은 조금 더 어렵습니다. 소수점 이하의 고정 자릿수를 설정하려면 leftfixed으로 바꾸고 setprecision()을 추가하여 소수점 이하 자릿수를 지정하십시오. 예를 들어, 소수점 과거 두 자리 숫자를 표시합니다 :

cout << setw(8) << fixed << setprecision(2) << myvec[i][0]; 

2-D를 벡터

당신은 vector< vector<double> > myvec;를 선언하고

하지만 (두 번째) 차원 3. 하드 코딩 나타납니다 미성년자를이 만들고있는 것을 의미한다 벡터의 벡터이며, 각 행은 3 개의 복식에 대한 저장소가있는 전체 벡터 객체입니다.

vector s는 데이터를 내부적으로 저장하지 않습니다. 실제 벡터 객체는 요소 수, 실제 데이터 저장소에 대한 포인터 및 아마도 몇 가지 다른 점을 저장합니다. 실제 데이터는 별도의 블록에 저장됩니다. 이것은 많은 오버 헤드와 메모리 단편화를 만듭니다 (모든 행은 데이터를 저장하기위한 블록을 할당합니다).

예를 들어, 1000x3 벡터의 경우 스택에 최상위 벡터 객체가 있고, 힙에 1000 개의 벡터 객체 (행당 하나)의 배열이 있고 그 각각은 3 개의 2 중 블록 블록을 가리 킵니다 따라서 힙에 1001 개의 개체가 있으며 모든 액세스에는 두 개의 포인터가 있어야합니다. 느리고 비효율적입니다.

vector은 길이가 고정 된 경우 과도합니다.그래서 나는 3 루타를 가진 각 구조, 구조의 벡터를 가진 권하고 싶습니다 :

struct point { 
    double x, y, z; 
}; 
vector<point> myvec; 

이 하나 개의 블록에 모든 데이터를 저장, point 완전히 독립적 때문이다. 그것을 할 수있는 C++ 반복자 방법,

for(unsigned int i = 0; i < myvec.size() ; ++i) 
{ 
    cout << setw(8) << left << myvec[i].x << ' ' << setw(8) << left << myvec[i].y 
     << ' ' << setw(8) << left << myvec[i].z << endl; 
} 

또는 : :이 operator[] 호출의 무리를 저장

for(vector<point>::const_iterator elem = myvec.begin(); elem != myvec.end() ; ++elem) 
{ 
    cout << setw(8) << left << elem.x << ' ' << setw(8) << left << elem.y 
     << ' ' << setw(8) << left << elem.z << endl; 
} 

그런 다음 코드입니다. auto 컴파일러를 알려줍니다

for(auto elem = myvec.begin(); elem != myvec.end() ; ++elem) 

무엇 myvec.begin() 수익률로 elem 유형과 동일하게 연결 : 컴파일러는 새로운 C++ 11 표준을 지원하는 경우 for() 라인을 변경할 수 있습니다. 또 다른 C++ 11의 방법은, 지원 될 가능성이 적습니다의 range-based for loop입니다 : 열 사이

for(auto elem: myvec) 
관련 문제