Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

경쟁 프로그래밍 초보자를 위한 몇 가지 유용한 C++ 트릭

<시간/>

여기에서 우리는 다른 영역에서 우리를 도울 수 있는 C++ 프로그래밍 언어의 몇 가지 좋은 트릭을 볼 것입니다. 경쟁적인 프로그래밍 이벤트에 참여하려는 경우 이러한 트릭을 사용하면 코드 작성 시간을 줄이는 데 도움이 됩니다. 이러한 예를 하나씩 살펴보겠습니다.

  • % 연산자를 사용하지 않고 숫자가 홀수인지 짝수인지 확인합니다. 이 트릭은 간단합니다. 숫자와 1로 비트 AND 연산을 수행할 수 있습니다. 결과가 0이 아니면 홀수이고 그렇지 않으면 짝수입니다. 논리가 너무 간단합니다. 모든 홀수는 LSb에서 1을 갖습니다. 따라서 AND를 1로 수행한 후 원하는 결과를 쉽게 얻을 수 있도록 LSb를 제외한 모든 문자를 마스킹합니다.
if ((n & 1) != 0){
   //this is odd
} else {
   //This is even
}
  • Shift 연산자를 사용하여 빠르게 곱하고 나눕니다. 숫자를 2n과 같은 숫자로 곱하려면 숫자를 왼쪽으로 n번 간단하게 이동할 수 있습니다. 마찬가지로 숫자를 2n으로 나누려면 숫자를 오른쪽으로 n번 이동합니다.
x = 40;
y = x << 2; //x will be multiplied with 4, so y = 160
cout << x;
x = 40;
y = x >> 2; //x will be divided by 4, so y = 10
cout << x;
  • 세 번째 변수를 사용하지 않고 두 숫자를 바꿀 수 있습니다. 이것은 + 및 - 연산자를 사용하여 수행할 수 있습니다. 그러나 비트 XOR 연산자를 사용하여 수행할 수도 있습니다. 수동으로 숫자를 확인하여 확인할 수 있습니다.
//swap x and y
x ^= y;
y ^= x;
x ^= y;
  • 때로는 코드에서 strlen() 함수를 사용할 수 없다는 제약이 있습니다. 이 경우 우리는 우리 자신의 strlen() 함수를 만듭니다. 케이스가 문자에만 액세스하는 경우에는 실제로 이 작업을 수행할 필요가 없습니다. i 위치의 문자가 유효한지(0이 아닌) 확인할 수 있습니다. 이것이 0이 아니면 횡단할 수 있고, 그렇지 않으면 중지합니다.
for(int i = 0; s[i]; i++){
   cout << s[i];
}
  • 대부분 STL에서 push_back() 함수를 사용하여 vector 등과 같은 일부 컨테이너에 새 요소를 추가합니다. 이를 사용하지 않고 emplace_back()도 사용할 수 있습니다. 이 기능은 훨씬 빠릅니다. 이것은 다른 곳에 메모리를 할당하지 않고 컨테이너에 할당된 메모리를 추가합니다.
  • C++는 내장된 GCD 기능을 제공합니다. 다른 경우에 사용할 수 있습니다. 구문은 아래와 같습니다.
__gcd(x, y) //find GCD of x and y
  • 메인 함수에서 배열의 최대 크기는 10^6 정도입니다. 그러나 배열이 전역적으로 선언되면 최대 10^7까지 크기를 선언할 수 있습니다.
  • 로그 연산을 사용하여 모든 숫자의 최상위 자릿수를 계산할 수 있습니다. 아이디어를 얻으려면 다음 논리를 참조하십시오.
n = 4578;
double k = log10(n);
k = k – floor(k);
int x = pow(10, k); //x is the most significant digit
  • 로그 연산을 사용하여 자릿수를 직접 계산합니다. 이를 위해 루프를 사용하지 않습니다.
n = 4578;
int digit_count = floot(log10(n)) + 1
  • 이 논리를 사용하여 숫자가 2의 거듭제곱인지 직접 확인할 수 있습니다.
x = 1024;
bool check = x && (!(x & (x-1))); //if this is true, then power of two.
  • C++에는 다음 조건을 확인할 수 있는 일부 내장 알고리즘이 있습니다.
all_of(left, left + n, isPositive()); //check all are positive or not
any_of(left, left + n, isPositive()); //check at least one positive or not.
none_of(left, left + n, isPositive()); //check no elements are positive
  • 한 컨테이너에서 다른 컨테이너로 요소를 복사하는 복사 기능.
int src[5] = {10, 20, 30, 40, 50};
int des[5];
copy_n(src, 5, dest);
  • itoa()라는 알고리즘이 있습니다. 이 알고리즘은 초기값을 *first에 할당한 다음 사후 증가 연산자를 사용하여 값을 사용하는 것처럼 순차적으로 증가하는 값의 범위를 만드는 데 사용할 수 있습니다.
int arr[5] = {0};
char str[5] = {0};
itoa(arr, arr+5, 15); //it will generate {15, 16, 17, 18, 19}
itoa(str, str+5, ‘A’); //it will generate {‘A’, ‘B’, ‘C’, ‘D’, ‘E’}
  • 이진 형식으로 값을 할당합니다. 0b 접두사를 이진수와 함께 사용하여 해당 숫자가 이진수로 제공됨을 나타낼 수 있습니다.
int x = 0b1101; //then x will hold 13
  • C++에서는 조건 연산자를 사용하지 않고 키워드를 사용할 수 있습니다. like 키워드 'and'는 '&' 대신 사용할 수 있습니다.
x = 10;
if(x < 10 and x > 5)
   cout << “True” << endl;
else
   cout << “False” << endl;
//This will return True