목록개발 및 공부/언어 (68)
NeuroWhAI의 잡블로그
https://ideone.com/jBCPmV #include using namespace std; int main() { // a[i] == *(a + i) == *(i + a) == i[a] int a[] = { 1, 2, 3, 4 }; cout
std::nth_element는 부분 정렬 알고리즘입니다.구체적인 동작은 이름에서 알 수 있듯이 n번째 요소를 얻을 수 있게 해주는 녀석인데요.무슨 기준으로 n번째냐고 하면 정렬되었을 때를 말합니다.v = [1 3 2 4]이고 n을 0부터라고 하였을 때 n=2라고 하면 알고리즘 수행 후 v[2]는 3이 됩니다.또한 v[:2]은 v[2]보다 작거나 같은 수만 있게 되며 당연히 v[3:]은 v[2]보다 작거나 큰 수만 있게 됩니다.(cppreference의 설명으로 하자면 v[:2]는 v[3:]의 수 보다 작거나 같다입니다.)비교 함수를 바꿔 주면 다르게 정렬된 상태에서의 n번째 요소를 얻을 수 있습니다. 대략적인 형태는 template void nth_element( Ran..
참고 : https://stackoverflow.com/questions/52216426/access-to-external-crates-from-module extern crate adder; /* mod adder { pub fn add(a: i32, b: i32) -> i32 { a + b } } */ #[cfg(test)] mod tests { #[test] fn it_works() { assert_eq!(adder::add(2, 2), 4); } }대충 위 코드처럼 했는데 안되더라고요.분명 레퍼런스에서 읽었던 내용 같은데 까먹음 ㅎㅎ;; super::adder::add(2, 2)이렇게 바꾸면 되고 혹은 #[cfg(test)] mod tests { use adder::{self}; ... }이렇게 ..
C++로 비유하면 Rc는 shared_ptr, Weak는 weak_ptr입니다.다만 스레드 안전하지 않다는 점이 다릅니다.스레드 안전한 구현은 std::sync에 Arc, Weak라는 이름으로 있습니다. 아래는 cppreference의 weak_ptr::lock 예제 코드를 Rust버전으로 옮겨 본 예제 코드입니다. use std::rc::{Rc, Weak}; fn observe(w_ptr: &Weak) { if let Some(rc_ptr) = w_ptr.upgrade() { println!("\tobserve() able to upgrade Weak, value={}", *rc_ptr); } else { println!("\tobserve() unable to upgrade Weak"); } } fn..
https://en.cppreference.com/w/cpp/thread/shared_mutexhttps://en.cppreference.com/w/cpp/thread/shared_lock 딱히 쓸 일이 없어서 몰랐는데 책에서 나왔으니 한번 봤습니다.shared_mutex 헤더에 있다고 하네요. 아래는 사용 예시. (mutex와는 별개의 이유로 C++17 이상에서만 컴파일 됩니다!) #include #include #include #include #include // 원자적인 카운터 class AtomicCounter { private: int m_counter = 0; mutable std::shared_mutex m_mutex; public: int getCount() const { std::shar..
https://en.cppreference.com/w/cpp/atomic/memory_orderhttps://stackoverflow.com/questions/12346487/what-do-each-memory-order-meanhttp://egloos.zum.com/sweeper/v/3059861https://www.slideshare.net/seao/c-atomic 허.. 이런게 있을 줄은 몰랐네요.새로 산 책에서 계속 나오는데 설명은 못알아먹겠고 ㅠㅠ아래는 한번 정리해본 내용인데 틀린 내용 지적 부탁드립니다 ㅠ // Thread 1: r1 = y.load(memory_order_relaxed); // A x.store(r1, memory_order_relaxed); // B // Thread 2: ..
package com.neurowhai class Foo { private fun privateObj() = object { val x = 42 } fun publicObj() = object { val x = 42 } fun test() { println(privateObj().x) //println(publicObj().x) // ERROR! } } // 객체 선언 (싱글톤) object Neurowhai { fun sayHi() = println("Hi") val name = "NeuroWhAI" } interface Factory { fun create(): T } // 동반자(?) 객체 class MyClass { var a = 0 companion object Abc/*이름 생략 가능*/ : ..
포인터의 타입이 달라도 같은 인스턴스를 가리키고 있다면 주소는 다 같을 줄 알았는데 아니더라고요. #include class Mother { public: virtual void foo1() { } int a; }; class Father { public: virtual void foo2() { } int b; }; class Child : public Mother, public Father { public: int c; }; int main() { Child c; Mother* m = &c; Father* f = &c; if ((void*)&c == (void*)m) { std::cout
package com.neurowhai data class Book(val id: Int, val name: String, var info: String = "NOPE") { // 오직 기본 생성자에 선언된 프로퍼티만 데이터로 취급하므로 // 그 외의 멤버는 toString, copy, hashCode등의 // 자동으로 생성된 메소드에서 다루지 않음. val fullName get() = "$id - $name" } class Outer { class Inner { fun foo() = 42 } } class Outer2 { var value: Int = 42 inner class Inner { // inner 키워드로 수식된 내부 클래스는 // 외부 클래스의 멤버에 접근 가능 fun sum(n: Int..
package com.neurowhai class Human { val name: String var age: Int = 1 get() = field set(value) { if (value != 1) { println("1살인데요.") } else { field = value } } val job get() = "구닌" var truth = "뉴로와이는 천재다." private set lateinit var info: String init { name = "NeuroWhAI" } fun setup() { info = "전역을 원한다." } } fun main(args: Array) { val me = Human() println("I am ${me.name}!") me.age = 42 println("..