My solutions to the exercises in "The Boost C++ Libraries"
I like books with excercises, but I also want solutions to see if I got it right. When working through The Boost C++ Libraries I only found solutions that I had to pay for, so here are my own solutions if you want to compare to yours. Please let me know if you thing I got it wrong or if you have a better solution.
Chapter 2: Smart Pointers
Excercise 1
#include <iostream>
#include <cstring>
#include <boost/shared_array.hpp>
boost::shared_array<char> get(const char *s)
{
int size = std::strlen(s);
boost::shared_array<char> text(new char[size + 1]);
std::strncpy(text.get(), s, size + 1);
return text;
}
void print(boost::shared_array<char> text)
{
std::cout << text.get() << std::endl;
}
int main(int argc, char *argv[])
{
if (argc < 2)
{
std::cerr << argv[0] << " <data>" << std::endl;
return 1;
}
boost::shared_array<char> text = get(argv[1]);
print(text);
}
Excercise 2
#include <vector>
#include <boost/ptr_container/ptr_vector.hpp>
template <typename T>
T *create()
{
return new T;
}
int main()
{
boost::ptr_vector<int> v;
v.push_back(create<int>());
}
Chapter 3: Function Objects
Excercise 1
#include <algorithm>
#include <functional>
#include <vector>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
int divide_by(int n, int div)
{
return n / div;
}
int main()
{
std::vector<int> numbers;
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
std::transform(numbers.begin(), numbers.end(), numbers.begin(),
boost::bind(divide_by, _1, 2));
std::for_each (numbers.begin(), numbers.end(), std::cout << boost::lambda::_1 << "\n");
}
Excercise 2
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <boost/lambda/lambda.hpp>
void save_size(std::vector<int> & sizes, const std::string & s)
{
sizes.push_back(s.size());
}
int main()
{
std::vector<std::string> strings;
strings.push_back("Boost");
strings.push_back("C++");
strings.push_back("Libraries");
std::vector<int> sizes;
std::for_each (strings.begin(), strings.end(), boost::bind(save_size, boost::ref(sizes), _1));
std::for_each (sizes.begin(), sizes.end(), std::cout << boost::lambda::_1 << "\n");
}
Excercise 3
#include <vector>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <boost/bind.hpp>
#include <boost/function.hpp>
void apply_fn(boost::function<int(const char*)> f, const char * data)
{
std::cout << f(data) << std::endl;
}
int main()
{
std::vector< boost::function<int(const char*)> > processors;
processors.push_back(std::atoi);
processors.push_back(std::strlen);
const char data[] = "1.23";
std::for_each(processors.begin(), processors.end(), boost::bind(apply_fn, _1, data));
}
Chapter 4: Event Handling
Excercise 1
#include <boost/signals2.hpp>
#include <iostream>
class button
{
public:
boost::signals2::connection add_handler(boost::function<void ()> h) { return handler.connect(h); }
void remove_handler(boost::signals2::connection c) { c.disconnect(); }
void click() { handler(); }
protected:
boost::signals2::signal<void ()> handler;
};
void func1()
{
std::cout << "Hello" << std::endl;
}
void func2()
{
std::cout << ", world!" << std::endl;
}
int main()
{
button btn;
btn.add_handler(func1);
boost::signals2::connection handle = btn.add_handler(func2);
btn.click();
btn.remove_handler(handle);
btn.click();
}
Chapter 5: String Handling
Excercise 1
#include <iostream>
#include <fstream>
#include <boost/regex.hpp>
#include <boost/algorithm/string.hpp>
int main()
{
std::ifstream ifs("sol.5.37.txt");
std::string xml;
while(ifs.good()) {
std::string line;
getline(ifs, line);
xml += line;
}
std::string first_name;
std::string last_name;
std::string dob_year;
std::string dob_month;
std::string dob_day;
float amount = 0.0;
std::string currency;
boost::smatch what;
boost::regex name_regex("<name>(.+)\\s+(\\w+)</name>");
if (boost::regex_search(xml, what, name_regex)) {
first_name = what[1];
last_name = what[2];
}
boost::regex dob_regex("<dob>(\\d+)\\-(\\d+)\\-(\\d+)</dob>");
if (boost::regex_search(xml, what, dob_regex)) {
dob_year = what[1];
dob_month = what[2];
dob_day = what[3];
}
boost::regex account_regex("<account>(.+)\\s+(\\w+)</account>");
if (boost::regex_search(xml, what, account_regex)) {
std::string a = what[1];
boost::algorithm::erase_all(a, ",");
amount = std::atof(a.c_str());
currency = what[2];
}
else std::cout << "no amount found in " << xml << std::endl;
std::cout << first_name << " " << last_name
<< " DOB: " << dob_day << "." << dob_month << "." << dob_year
<< " : " << floor(amount) << " " << currency << std::endl;
}
Data
<person>
<name>Karl-Heinz Huber</name>
<dob>1970-9-30</dob>
<account>2,900.64 USD</account>
</person>
Excercise 2
#include <iostream>
#include <fstream>
#include <boost/algorithm/string.hpp>
#include <boost/format.hpp>
int main()
{
std::ifstream ifs("sol.5.38.txt");
while(ifs.good()) {
std::string line;
getline(ifs, line);
std::vector<std::string> tok;
boost::algorithm::split(tok, line, boost::algorithm::is_space());
if (tok.size() == 5)
std::cout << boost::format("%-10s -> %-10s %4.2f EUR (%05s-%05s)") % tok[0] % tok[1] % tok[2] % tok[3] % tok[4] << std::endl;
}
}
Data
Munich Hamburg 92.12 8:25 9:45
Chapter 6: Multithreading
Excercise 1
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/cstdint.hpp>
#include <iostream>
#include <boost/thread.hpp>
boost::mutex mutex;
boost::uint64_t sum = 0;
void partial_sum(int from, int to)
{
boost::uint64_t local_sum = 0;
for (int i = from; i < to; ++i)
local_sum += i;
mutex.lock();
sum += local_sum;
mutex.unlock();
}
int main()
{
boost::posix_time::ptime start =
boost::posix_time::microsec_clock::local_time();
boost::thread t1(partial_sum, 0, 1000000000/2);
boost::thread t2(partial_sum, 1000000000/2, 1000000000);
t1.join();
t2.join();
boost::posix_time::ptime end =
boost::posix_time::microsec_clock::local_time();
std::cout << end - start << std::endl;
std::cout << sum << std::endl;
}
Excercise 2
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/cstdint.hpp>
#include <iostream>
#include <vector>
#include <boost/thread.hpp>
boost::mutex mutex;
boost::uint64_t sum = 0;
void partial_sum(int from, int to)
{
boost::uint64_t local_sum = 0;
for (int i = from; i < to; ++i)
local_sum += i;
mutex.lock();
sum += local_sum;
mutex.unlock();
}
int main()
{
boost::posix_time::ptime start =
boost::posix_time::microsec_clock::local_time();
std::vector<boost::thread*> threads;
int num_threads = boost::thread::hardware_concurrency();
unsigned chunk = 1000000000 / num_threads;
for(int i=0; i < num_threads; ++i) {
boost::thread *t = new boost::thread(partial_sum, i*chunk, (i+1)*chunk);
threads.push_back(t);
}
for(unsigned i=0; i < threads.size(); ++i) {
threads[i]->join();
}
boost::posix_time::ptime end =
boost::posix_time::microsec_clock::local_time();
std::cout << end - start << std::endl;
std::cout << sum << std::endl;
}
Excercise 3
#include <iostream>
#include <boost/thread.hpp>
boost::mutex calc_mutex;
boost::mutex output_mutex;
int sum = 0;
void calculate()
{
calc_mutex.lock();
sum = 0;
for (int i = 0; i < 1000; ++i)
sum += i;
calc_mutex.unlock();
}
void print()
{
output_mutex.lock();
std::cout << sum << std::endl;
output_mutex.unlock();
}
void thread()
{
calculate();
print();
}
int main()
{
boost::thread t1(thread);
boost::thread t2(thread);
t1.join();
t2.join();
}
My solutions to the exercises in "The Boost C++ Libraries"的更多相关文章
- The Boost C++ Libraries
" ...one of the most highly regarded and expertly designed C++ library projects in the world.&q ...
- [Z]The Boost C++ Libraries
看起来是个学习boost非常不错的材料,应该是boost的官方教程之类: http://theboostcpplibraries.com/
- The Boost C++ Libraries中文教程
http://zh.highscore.de/cpp/boost/
- 《The Boost C++ Libraries》 第一章 智能指针
Boost.SmartPointers中提供了多种智能指针,它们采用在智能指针析构时释放内存的方式,帮助管理动态分配的对象.由于析构函数在智能指针生命周期结束时被执行,所以由它管理的动态分配对象可以保 ...
- boost 文件系统
第 9 章 文件系统 目录 9.1 概述 9.2 路径 9.3 文件与目录 9.4 文件流 9.5 练习 该书采用 Creative Commons License 授权 9.1. 概述 库 Boo ...
- 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法
1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...
- Ubuntu下安装boost
今天开始安装配置Ubuntu开发环境(Ubuntu 12.04).在干活之前就预计到会遇到很多问题,但是没想到一开始就卡壳,可能是linux中各种包的依赖关系太复杂了,决定写个帖子记录一下,免得以后再 ...
- linux下编译安装boost库
linux下编译安装boost库 linux下编译安装boost库 1.下载并解压boost 1.58 源代码 下载 解压 2.运行bootstrap.sh 3.使用b2进行构建 构建成功的提示 4. ...
- Using Boost Libraries in Windows Store and Phone Applications
Using Boost Libraries in Windows Store and Phone Applications RATE THIS Steven Gates 18 Jul 2014 5:3 ...
随机推荐
- JS对象 向上取整ceil() ceil() 方法可对一个数进行向上取整。 语法: Math.ceil(x) 注意:它返回的是大于或等于x,并且与x最接近的整数。
向上取整ceil() ceil() 方法可对一个数进行向上取整. 语法: Math.ceil(x) 参数说明: 注意:它返回的是大于或等于x,并且与x最接近的整数. 我们将把 ceil() 方法运用到 ...
- 多个for循环使用
for循环 例子 语法 vue.js的for循环 <div id="myfor"><li v-for="student in studentList&q ...
- ReentrantLock中的公平锁与非公平锁
简介 ReentrantLock是一种可重入锁,可以等同于synchronized的使用,但是比synchronized更加的强大.灵活. 一个可重入的排他锁,它具有与使用 synchronized ...
- drop大表
删除大表: .给对应表的ibd文件建立硬链接,因为表的数据和索引都在该文件中. ln /home/work/status.ibd /home/work/status.ibd.hdlk .主库上删除表, ...
- python queue, pipe, manage
线程中的Queue import time import threading import queue import random def putMessage(): for i in "H ...
- (转)谈谈Android中的Rect类——奇葩的思维
最近在工作中遇到了一些问题,总结下来就是Android中Rect这个类造成的.不得不说,不知道Android SDK的开发人员是怎么想的, 这个类设计的太奇葩了.首先介绍一下Rect类:Rect类主要 ...
- 杂项-Maven-jna:JNA(Java Native Access)
ylbtech-杂项-Maven-jna:JNA(Java Native Access) JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(nat ...
- H2数据库的基本使用
文章目录 下载jar包 启动服务 下载jar包 下载h2-1.3.176.jar 这个包(部分服务版本不一致,请自行更换版本) 启动服务 从终端定位到刚才jar包下载的位置,比如我这里是Downloa ...
- SpringCloud学习笔记(九):SpringCloud Config 分布式配置中心
概述 分布式系统面临的-配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的.动 ...
- nodejs与websocket模拟简单的聊天室
nodejs与websocket模拟简单的聊天室 server.js const http = require('http') const fs = require('fs') var userip ...