0%

1. for_each

对于一些collection(vector,list,set,map)可以对其中每个元素执行后面的函数;

1
2
3
auto lambda_echo = [](int i ) { std::cout << i << std::endl; };  
std::vector<int> col{20,24,37,42,23,45,37};
for_each(col,lambda_echo);

阅读全文 »

本文曾发表于《程序员》2015年2月刊。转载请注明出处。

1概述

C++11的新特性—可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一。虽然掌握可变模版参数有一定难度,但是它却是C++11中最有意思的一个特性,本文希望带领读者由浅入深的认识和掌握这一特性,同时也会通过一些实例来展示可变参数模版的一些用法。

阅读全文 »

1. 语言基础 (C/C++)

(0) 指针和引用的区别

  • 指针是一个新的变量,指向另一个变量的地址,我们可以通过访问这个地址来修改另一个变量;而引用是一个别名,对引用的操作就是对变量的本身进行操作
  • 指针可以有多级,引用只有一级
  • 传参的时候,使用指针的话需要解引用才能对参数进行修改,而使用引用可以直接对参数进行修改
  • 指针的大小一般是4个字节,引用的大小取决于被引用对象的大小
  • 指针可以为空,引用不可以。

(1)在函数参数传递的时候,什么时候使用指针,什么时候使用引用?

  • 需要返回函数内局部变量的内存的时候用指针。使用指针传参需要开辟内存,用完要记得释放指针,不然会内存泄漏。而返回局部变量的引用是没有意义的
  • 对栈空间大小比较敏感(比如递归)的时候使用引用。使用引用传递不需要创建临时变量,开销要更小
  • 类对象作为参数传递的时候使用引用,这是C++类对象传递的标准方式
阅读全文 »

快速设置VSCode使用远程服务器(通常是Linux)上的Docker容器来作为开发环境

优点

  • 本地桌面干净: 只有docker客户端~
  • 开发环境代码化:Dockerfile
  • 切换环境只需切换容器

远程主机配置

安装 Docker Engine

参考这里官方文档

Docker开启远程端口

在远程主机上:

  1. 创建文件 daemon.json 到目录 /etc/docker:

    1
    {"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}
  2. 创建文件 /etc/systemd/system/docker.service.d/override.conf:

    1
    2
    3
    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd
  3. 重启docker:

    1
    2
    systemctl daemon-reload
    systemctl restart docker.service
    阅读全文 »

影音播放 Emby

这个网址下载Ubuntu Server,执行

1
dpkg -i emby-server-deb_*.deb

打开后自动配置在 http://localhost:8096 端口上。

配置媒体库后,可能需要对目标目录配置至少读权限:

1
2
chown emby.emby /media/sean/1TB -R
chmod 755 /media/sean/1TB

阅读全文 »

安装 Ipopt

1
2
3
4
5
6
7
8
9
10
$ wget https://www.coin-or.org/download/source/Ipopt/Ipopt-3.12.7.zip 
$ unzip Ipopt-3.12.7.zip
$ rm Ipopt-3.12.7.zip
$ cd Ipopt-3.12.7
$ ./configure
......
configure: Main configuration of Ipopt successful
$ make
$ make test
$ make install

参考:https://www.jianshu.com/p/4cdaa93d460b

参考:https://github.com/bapaden/ipopt-cmake-demo

下载 HSL MA21求解器 :

http://www.hsl.rl.ac.uk/ipopt/
https://github.com/casadi/casadi/wiki/Obtaining-HSL

没有学校邮箱的同学,可以选择下载个人版的。

为了避免后续问题,建议安装源码版本的。

阅读全文 »

在数学中,集合是最基本的概念之一。编程时,我们不可避免地会涉及到集合及其相关操作。在 C++ 中,标准模板库(STL)提供了 std::set/std::unordered_set 两种传统意义上的集合(除此之外,还有 std::multisetstd::unordered_multiset)。其中,std::set(和 std::multiset)定义在头文件 set 当中,从 C++98 起就有支持;而 std::unordered_set(和 std::unordered_multiset)则定义在头文件 unordered_set 当中,从 C++11 开始支持。

此篇我们讨论如何在 C++ 中集合如何进行交集和并集操作。

阅读全文 »

  1. 亚细亚大楼:折衷主义

    占地面积1739平方米,建筑面积11984平方米。总体为钢筋混凝土的框架结构,但外立面使用花岗岩和清水砖砌成。东、南两侧的外立面沿东南角呈对称结构,建筑风格属折衷主义。另外从横向和竖向而言均依据三段式结构进行设计建造,横向上,底部与顶部均吸收巴洛克风格,而中部又采用了现代主义的设计。竖向上,位于中央的底部与顶部均使用贯高两层的双爱奥尼柱式。在功能设置上,中央除底部外,中部和顶部均设置内凹阳台。

    另外,大楼为调和视觉感官,在东南角即延安东路)中山东一路路口也使用了凹面设计。1938年加建的第八层,其四角也采用了凹面式。平面上,建筑则为回字形,中间设计有天井。为确保建筑物的采光,整幢大楼共有大小窗户100余个。另外,在二层、五层和八层的窗、阳台廊柱均按半圆形设计。

    阅读全文 »

由于home文件夹较大,且其默认是在系统盘下的. 当系统盘空间不足时,我们可以将Home文件夹移至新磁盘下的新分区内.

Overview

This guide offers detailed instructions for migrating your home directory into its own dedicated partition. Setting up /home on a separate partition is beneficial because your settings, files, and desktop will be maintained if you upgrade, (re)install Ubuntu or another distro. This works because /home has a subdirectory for each user’s settings and files which contain all the data & settings of that user. Telling Ubuntu to use an existing home partition can be done by selecting “Manual Partitioning” during the installation of Ubuntu and specifying that you want your home partitions mount point to be /home, ensure you mark your /home partition not be formatted in the process. You should also make sure the usernames you enter for accounts during installation match usernames that existed in a previous installation.

This guide will follow these 8 basic steps:

  1. Set-up your new partition
  2. Find the uuid (=address) of the new partition
  3. Backup and edit your fstab to mount the new partition as /media/home (just for the time being) and reboot.
  4. Use rsync to migrate all data from /home into /media/home
  5. Check copying worked!
  6. Move /home to /old_home to avoid confusion later!
  7. Edit fstab again so the new partition mounts as /home instead of as /media/home
  8. Reboot or remount all. Check system seems to be working well
  9. Delete the /old_home after a while

The guide is written in such a way so that at any point in time if there is a system failure, power outage or random restart that it will not have a negative impact on the system and SHOULD safeguard against the possibility of the user accidentally deleting their home directory in the process.

阅读全文 »

Install

1
2
3
4
5
6
7
8
9
10
11
12
#pre-requirements
sudo apt install python3-dev
pip install pytest
#download source code
git clone https://github.com/pybind/pybind11.git
cd pybind11
mkdir build
cd build
#make
cmake ..
make check -j 8
sudo make install

Using

Attention: DO NOT use g++ or c++ to build (in case we haven’t install pybind11 in python environment(which is also no need to do)).

Instead, we use Cmake to compile our code.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cmake_minimum_required(VERSION 3.0)

set(PROJ_NAME "example")
project(${PROJ_NAME})

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3")

find_package(pybind11 REQUIRED)
pybind11_add_module(${PROJ_NAME} example.cpp)

target_link_libraries(${PROJ_NAME} PRIVATE pybind11::module)

find_package(Python)
find_path(PYTHON_SITE_PACKAGES site-packages ${PYTHON_INCLUDE_PATH}/..)

install(TARGETS ${PROJ_NAME} RUNTIME DESTINATION ${PYTHON_SITE_PACKAGES}
LIBRARY DESTINATION ${PYTHON_SITE_PACKAGES}
ARCHIVE DESTINATION ${PYTHON_SITE_PACKAGES}
)

And folder is such like:

1
2
3
4
├── build
│ ├ ...
├── CMakeLists.txt
└── example.cpp