C++에서 cin을 사용하여 입력을 받을 때, 기본적으로 공백 문자(스페이스, 탭, 개행)을 기준으로 데이터를 분리함
→ 띄어쓰기(스페이스)는 cin에서 입력을 구분하는 구분자로 작용함
예시
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cout << "정수 a, b, c를 입력하세요: ";
cin >> a >> b >> c;
cout << "입력된 값: a=" << a << ", b=" << b << ", c=" << c << endl;
return 0;
}
"1 2 3"로 입력하면 cin은 이를 공백 문자를 기준으로 각 변수에 할당함
사례
#include <iostream>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
cout << "N: "<< N <<", M: " << M << endl;
char a;
cin>>a;
if (a=='*'){
int b;
cin>>b;
cout<<b<<endl;
}
return 0;
}
For a given nonlinear mappingΦ(𝑥), the input data spaceℝ𝑛can be mapped into the Feature space
Φ : ℝ𝑛 ↦ Feature space 𝑥 ↦ Φ(𝑥)
The feature map is an arbitrary map into thefeature space𝐻.
For example, if𝐻isfinite dimensional(say, of dimension𝑚), you can pick anorthonormal basisfor it,
and think ofeach component ofΦin that basisas afeature. This is what scalar features are.
Inner product space
orthonormal basis
In mathematics, particularly linear algebra, an orthonormal basis for an inner product space V with finite dimension is a basis for V whose vectors are orthonormal, that is, they are all unit vectors and orthogonal to each other.
For example, the standard basis(표준기저) for a Euclidean space R" is an orthonormal basis, where the relevant inner product is the dot product of vectors. The image(공역) of the standard basis under a rotation or reflection (or any orthogonal transformation) is also orthonormal(=standard basis를 가지고 rotation과 같은 orthogonal transformation을 하면 그 transformed vector들도 orthonormal이다), and every orthonormal basis for R" arises in this fashion.
*standard basis: 유클리드 공간에서 직교 좌표계의 축을 향하는 단위 벡터의 집합
Every vector a in three dimensions is a linear combination of the standard basis vectors i, j and k.
* basis: 벡터 공간을 선형생성하는 선형독립인 벡터들이다. 달리 말해, 벡터 공간의 임의의 벡터에게 선형결합으로서 유일한 표현을 부여하는 벡터들
For a general inner product space V, an orthonormal basis can be used to define normalized orthogonal coordinates on V. Under these coordinates, the inner product becomes a dot product of vectors. (The inner product는 dot product의 일반화된 버전 toabstract vector spacesover afieldofscalars, being either the field ofreal numbers or the field ofcomplex numbers)
orthogonal (직교)
orthonormal
Two vectors are said to be orthogonalif their dot product is zero Orthogonal vectors areperpendicularto each other
new operator를 통해 컴파일이 아닌 프로그램 실행 중 동적으로 할당할 수 있다 위 예시와 같이 미리 int로 size 변수를 선언한 후 → new int[size] 선언 → cin 입력으로 저장하면 된다
int main() {
int size, i;
std::cout << "배열의 크기를 입력하세요: ";
std::cin >> size;
int* dynamicArray = new int[size];
//배열 사이즈를 미리 알 수 없을 때, new operator를 통해 컴파일이 아닌 프로그램 실행 중 동적으로 할당할 수 있다
//위 예시와 같이 미리 int로 size 변수를 선언한 후 → new int[size] 선언 → cin 입력으로 저장하면 된다
for (i=0;i<size;i++){
dynamicArray[i] = i;
}
for (i=0;i<size;i++){
cout<<dynamicArray[i]<<endl;
}
delete[] dynamicArray;
}
/*
배열의 크기를 입력하세요: 5
0
1
2
3
4
*/
- new 연산자를 사용한다면 memory leak를 방지하기 위해 반드시 delete를 해주어야 한다
동적 할당의 유용성
가변적인 크기: 프로그램이 실행 중, 데이터 구조의 크기를 변경해야 할 때 유용함
- 배열의 크기를 동적으로 조정하거나 필요에 따라 메모리를 할당할 수 있음
메모리 사용 최적화: 정적 할당(static allocation)은 메모리를 미리 할당하므로 메모리 낭비가 발생할 수 있음
- 동적 할당은 필요한 만큼 메모리를 할당하므로 메모리 사용을 최적화할 수 있음
유연성:동적할당은복잡한데이터구조를생성하고관리하는데필요한 '유연성'을제공
- 동적으로할당된메모리를사용하여복사, 이동, 삽입, 삭제등의작업을수행할수있음
delete의 추가 예시
MyClass* obj = new MyClass;
delete obj; // 클래스 객체 해제
int* dynamicArray = new int[10];
delete[] dynamicArray; // 배열 해제
class MyClass {
private:
int* data;
public:
MyClass() {
data = new int;
}
~MyClass() {
delete data; // 멤버 변수에 대한 동적 할당 메모리 해제
}
};
class MyClass {
private:
int* dataArray;
public:
MyClass(int size) {
dataArray = new int[size];
}
~MyClass() {
delete[] dataArray; // 배열에 대한 동적 할당 메모리 해제
}
};
const int num = 1; // 일반적인 표현
int const num = 1; // 위와 같은 의미
num = 2; // Compile Error
1-2) const 멤버 변수 (클래스 안)
class Foo
{
const int num; // 메모리 할당이 아님
Foo(void)
: num(1) // const int num = 1;
{
}
};
class Bar
{
const int num;
Bar(void)
{
num = 1; // Compile Error
// const int num;
// num = 1;
}
};
const 변수는 반드시 선언 시 초기화를 해야 함
class의 멤버 변수를 const로 선언 시에는 반드시 초기화 리스트(Initialize List)를 사용해야 함
*C++11부터는 class 내부에서const int num = 1;과 같이 선언 및 초기화가 가능하기도 하지만, 초기화 리스트를 사용하여 멤버 변수를 초기화하는 것이 일반적임
*class 내부에서const int num;을 한 것은메모리를 할당하는 것이 아니라 단순히 컴파일러에게 class가 어떤 형태인지 알린 것일 뿐
*따라서 class 내부에서는const int num;과 같은 형태가 가능 => 이후 초기화 리스트로 실제 값 초기화
1-3) const 포인터 변수
a) const 위치가 맨 앞에 있으면서, 포인터 변수가 가리키는 값에 대하여 상수화
int num = 1;
const int* ptr = # // *ptr을 상수화
*ptr = 2; // Compile Error
num = 2; // Pass
**포인터를 통해 num의 value를 조작하는 것을 불가능하게 만든 것 (*ptr = 2는 컴파일에러)
반드시 class 내부에서 정의된 멤버함수만 가능 !! → 실제 상수화되는 대상은 해당 class의 멤버 변수
의미: 해당 멤버 함수 내에서는 동일한 class의 모든 멤버 변수를 상수화시킨다 (멤버 함수의 local variable은 조작 가능, 상수화되지 않음)
int GetString(void) const; // Compile Error
class Foo
{
int num = 1;
int GetNum(void) const
{
int a = 1;
a++; // 지역 변수는 가능
num++; // Compile Error
return num;
}
};