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"的更多相关文章

  1. The Boost C++ Libraries

    " ...one of the most highly regarded and expertly designed C++ library projects in the world.&q ...

  2. [Z]The Boost C++ Libraries

    看起来是个学习boost非常不错的材料,应该是boost的官方教程之类: http://theboostcpplibraries.com/

  3. The Boost C++ Libraries中文教程

    http://zh.highscore.de/cpp/boost/

  4. 《The Boost C++ Libraries》 第一章 智能指针

    Boost.SmartPointers中提供了多种智能指针,它们采用在智能指针析构时释放内存的方式,帮助管理动态分配的对象.由于析构函数在智能指针生命周期结束时被执行,所以由它管理的动态分配对象可以保 ...

  5. boost 文件系统

    第 9 章 文件系统 目录 9.1 概述 9.2 路径 9.3 文件与目录 9.4 文件流 9.5 练习  该书采用 Creative Commons License 授权 9.1. 概述 库 Boo ...

  6. 新手,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 ...

  7. Ubuntu下安装boost

    今天开始安装配置Ubuntu开发环境(Ubuntu 12.04).在干活之前就预计到会遇到很多问题,但是没想到一开始就卡壳,可能是linux中各种包的依赖关系太复杂了,决定写个帖子记录一下,免得以后再 ...

  8. linux下编译安装boost库

    linux下编译安装boost库 linux下编译安装boost库 1.下载并解压boost 1.58 源代码 下载 解压 2.运行bootstrap.sh 3.使用b2进行构建 构建成功的提示 4. ...

  9. 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 ...

随机推荐

  1. kerberos协议介绍

    一.kerberos认证过程: client向kerberos服务请求,希望获取访问server的权限.kerberos得到了这个消息,首先得判断client是否是可信赖的,也就是白名单黑名单的说法. ...

  2. 【JZOJ6275】小L的数列

    description analysis 考虑矩阵乘法 设初始\(m×m\)矩阵上\(i\)行\(j\)列的数字表示该矩阵第\(j\)位上\(f[i]\)的指数 那么一开始表示\(f[1..k]\)的 ...

  3. gevent实现并发

    #_author:来童星#date:2019/12/12import geventimport timedef func1(): print('\033[31;1mfun1 starting...\0 ...

  4. Perl 数组

    Perl 数组 Perl 数组一个是存储标量值的列表变量,变量可以是不同类型. 数组变量以 @ 开头.访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下: 实例 #!/usr/b ...

  5. 阿里云在云栖大会发布RPA最新3.4版本,将与达摩院联合探索人工智能领域

    9月26日,在2019年杭州云栖大会上,阿里云发布了RPA最新V3.4版本,全新升级了增加诸如录屏审计.JAVA应用录制能力.达摩院OCR内置组件.语法检查与智能提示能力增强等功能. RPA全名称Ro ...

  6. 弹性网卡支持私网多IP

    摘要: 弹性网卡支持多IP功能可以最多在一块弹性网卡配置20个私网IP地址,特别适用于于以下场景. 1.单个服务器上托管多个应用,提升实例利用率,每个应用对外暴露一个独立的服务IP地址. 2.当实例发 ...

  7. 字符串——cf1109B

    /* 先判不可行的情况:n/2的是单一字符 判只切割一次能不能组成回文 枚举每个切割点,交换两个串的位置 剩下就是割两次 */ #include<bits/stdc++.h> #inclu ...

  8. web Magic报错 NoSuchMethodError NoSuchMethodError: com.google.common.util.concurrent.SimpleTimeLimiter

    webMagic使用selenium的时候遇到报错: java.lang.NoSuchMethodError: com.google.common.util.concurrent.SimpleTime ...

  9. SQLServer 中存储过程

    SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)存储过程有三种返回:   1.   用return返回数字型数据   2.   用返回参数 ...

  10. Classpath in jar关于java加载第三方jar的集中方法和详细解释。

    转载地址:http://www.iteye.com/topic/332580 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个ja ...