<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[CoAAColA的博客]]></title><description><![CDATA[我从细小的源泉里饮水，而我的渴大于一座海]]></description><link>https://blog.youkuaiyun.com/CoAAColA</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; CoAAColA]]></copyright><item><title><![CDATA[详解中缀表达式转化为后缀表达式并求值，附代码解释]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/114635393</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/114635393</guid><author>CoAAColA</author><pubDate>Wed, 10 Mar 2021 15:27:44 +0800</pubDate><description><![CDATA[思路
首先我们需要知道如何转化表达式并求值：首先不同的运算符有不同的优先级：对于(，)，优先级最高，其次是*，/，最低是+，-。在从左往右扫描字符串时，遇到数字，就将其直接压入数组中。遇到操作符时，如果当前栈为空，那么直接压入栈中，如果栈不为空，那么将栈顶操作符优先级大于等于当前操作符的操作符pop出栈，并压入数组，直到栈顶操作符优先级小于当前操作符或栈为空才停止此次操作，并将当前操作符压入栈中。
由于在我的代码中遇到左括号是直接递归，右括号return，因此上面的处理中不需要考虑括号。
得到表达式后，我们]]></description><category></category></item><item><title><![CDATA[C++ Primer第五版练习 14.42]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/113123603</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/113123603</guid><author>CoAAColA</author><pubDate>Mon, 25 Jan 2021 17:26:38 +0800</pubDate><description><![CDATA[练习 14.42: 使用标准库函数对象及适配器定义一条表达式，令其：

(a) 统计大于1024的值有多少个。

#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;functional&gt;
#include &lt;algorithm&gt;

using namespace std;
using std::placeholders::_1;

int main() {
	vector&lt;int&gt; vec{
		1, ]]></description><category></category></item><item><title><![CDATA[STL源码剖析5.8节hash_set 结尾处示意图疑似错误]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/110673070</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/110673070</guid><author>CoAAColA</author><pubDate>Fri, 04 Dec 2020 21:32:17 +0800</pubDate><description><![CDATA[hash_set&lt;int&gt; Set;
Set.insert(3);
Set.insert(196);
Set.insert(1);
Set.insert(389);
Set.insert(194);
Set.insert(387);
hash_set&lt;int&gt;::iterator ite1 = Set.begin();
hash_set&lt;int&gt;::iterator ite2 = Set.end();
for(; ite1 != ite2; ++ite1)
	cout &]]></description><category></category></item><item><title><![CDATA[C++ Primer第五版练习 16.39]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/109754238</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/109754238</guid><author>CoAAColA</author><pubDate>Tue, 17 Nov 2020 21:30:15 +0800</pubDate><description><![CDATA[练习 16.39：对16.1.1节中的原始版本的compare函数，使用一个显式模板实参，使得可以向函数传递两个字符串字面常量。
思路：因为原函数中只有一个模板类型参数，如果是数组的引用的话会要求两个字符串字面常量的长度相等，同时函数形参是引用类型，不可以对数组的实参应用正常的指针转换，因此必须转换类型。由此我们想到显式指定模板实参为指针类型，即可达到要求。
代码：
template&lt;typename T&gt;
int cmp(const T &amp;v1, const T &amp;v2) {
]]></description><category></category></item><item><title><![CDATA[简单实现c++中的shared_ptr及unique_ptr]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/109718591</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/109718591</guid><author>CoAAColA</author><pubDate>Mon, 16 Nov 2020 12:39:10 +0800</pubDate><description><![CDATA[练习 16.28：编写你自己版本的shared_ptr和unique_ptr.

思路：由现在在书中学到的内容，实现一个智能指针使用引用计数的方式来实现。同时并没有实现weak_ptr，因此实现智能指针是比较简单的。我在实现过程中一部分参考了std的写法，比起我之前的写法简洁了不少，但有一些特性因为不清楚std怎么实现的，不过为了追求与std的一致性，还是实现了，这一部分代码会很不自然。同时在shared_ptr实现中使用了copy and swap技术，不仅代码变得简洁了许多，同时也顺带解决了一些问题。
]]></description><category></category></item><item><title><![CDATA[C++ Primer第五版练习 16.19、16.20]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/109687958</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/109687958</guid><author>CoAAColA</author><pubDate>Sat, 14 Nov 2020 11:01:13 +0800</pubDate><description><![CDATA[练习 16.19：编写函数，接受一个容器的引用，打印容器中的元素。使用容器的size_type和size成员来控制打印元素的循环。
代码：
template &lt;typename T&gt;
void my_print(const T &amp;cont) {
	/*for (typename T::size_type i = 0; i &lt; cont.size(); ++i) { //该版本要求容器的迭代器为随机访问迭代器
		cout &lt;&lt; cont[i] &lt;&lt; endl]]></description><category></category></item><item><title><![CDATA[C++ Primer第五版练习 16.16]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/109683580</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/109683580</guid><author>CoAAColA</author><pubDate>Fri, 13 Nov 2020 22:19:07 +0800</pubDate><description><![CDATA[**练习 16.16：**将StrVec类重写为模板，命名为Vec。
代码：
#include &lt;algorithm&gt;
#include &lt;string&gt;
#include &lt;stdexcept&gt;

template &lt;typename T&gt; class Vec{
	friend bool operator==(const Vec&lt;T&gt; &amp;lhs, const Vec&lt;T&gt; &amp;rhs) {
		if (lhs.size(]]></description><category></category></item><item><title><![CDATA[C++ Primer第五版练习 16.4、16.5、16.6、16.7]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/109168599</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/109168599</guid><author>CoAAColA</author><pubDate>Mon, 19 Oct 2020 20:40:39 +0800</pubDate><description><![CDATA[代码：
template&lt;typename Iter, typename ValueType&gt;
Iter my_find(const Iter &amp;begin, const Iter &amp;end, const ValueType &amp;val) {
	for (Iter bgn = begin; bgn != end; ++bgn) {
		if (*bgn == val) return bgn;
	}
	return end;
}

template&lt;typename T]]></description><category></category></item><item><title><![CDATA[使用cmake-gui生成cocos2d-x-4.0的工程文件常见的一个问题]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/108886085</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/108886085</guid><author>CoAAColA</author><pubDate>Wed, 30 Sep 2020 15:32:48 +0800</pubDate><description><![CDATA[在选择对应的平台时如果选择x64，会有一些不会解释的错误，此时改成Win32就好了。

改成

就可以解决问题了 如果是这个问题的话

]]></description><category></category></item><item><title><![CDATA[C++Primer第五版练习14.38、14.39]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/108741109</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/108741109</guid><author>CoAAColA</author><pubDate>Tue, 22 Sep 2020 21:09:45 +0800</pubDate><description><![CDATA[练习 14.38：编写一个类令其检查某个给定的string对象的长度是否与一个阈值相等。使用该对象编写程序，统计并报告在输入的文件中长度为1的单词有多少个、长度为2的单词有多少个、······长度为10的单词又有多少个。
代码：
class CheckLength {
public:
	CheckLength(string::size_type _len) :
		len(_len) { }
	bool operator()(const string &amp;lhs) {
		return lhs.len]]></description><category></category></item><item><title><![CDATA[C++Primer第五版练习14.35、14.36、14.37]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/108733115</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/108733115</guid><author>CoAAColA</author><pubDate>Tue, 22 Sep 2020 15:28:25 +0800</pubDate><description><![CDATA[练习 14.35：编写一个类似于PrintString的类，令其从istream中读取一行输入，然后返回一个表示我们所读内容的string。如果读取失败，返回空string。
练习 14.36：使用前一个练习定义的类读取标准输入，将每一行保存为vector的一个元素。
练习 14.37：编写一个类令其检查两个值是否相等。使用该对象及标准库算法编写程序，令其替换某个序列中具有给定值的所有实例。

代码：
class PrintString {
public:
	PrintString(ostream &amp]]></description><category></category></item><item><title><![CDATA[C++Primer第五版练习题13.40]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/108640270</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/108640270</guid><author>CoAAColA</author><pubDate>Thu, 17 Sep 2020 13:13:18 +0800</pubDate><description><![CDATA[练习 13.40：为你的StrVec类添加一个构造函数，它接受一个initializer_list&lt;string&gt;参数

StrVec::StrVec(const std::initializer_list&lt;std::string&gt; &amp;il) {
	auto newdata = alloc_n_copy(il.begin(), il.end());
	elements = newdata.first;
	first_free = cap = newdata.second;
}]]></description><category></category></item><item><title><![CDATA[C++Primer第五版练习13.39]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/108640098</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/108640098</guid><author>CoAAColA</author><pubDate>Thu, 17 Sep 2020 13:08:10 +0800</pubDate><description><![CDATA[练习 13.39：编写你自己版本的StrVec，包括自己版本的reserve，capacity和resize。

allocate_and_construct(std::size_t):
void StrVec::allocate_and_construct(std::size_t newcapacity) {
	auto newdata = alloc.allocate(newcapacity);
	auto dest = newdata;
	auto elem = elements;
	for (std]]></description><category></category></item><item><title><![CDATA[C++ Primer第五版练习题11.35]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/108225183</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/108225183</guid><author>CoAAColA</author><pubDate>Tue, 25 Aug 2020 17:27:44 +0800</pubDate><description><![CDATA[练习11.35: 在buildMap中，如果进行如下改写，会有什么效果？
	trans_map[key] = value.substr(1);
改为trans_map.insert({ key, value.substr(1) });


这题主要是考察map的下标操作与insert成员函数的区别：
对于下标运算符， 有两种情况：

关键字已存在，那么会将关键字对应的元素的关联值替换为新值
关键字不存在，那么会将一个新的元素插入到map中，关键字即为下标运算符接受的索引，值进行值初始化。最后提取出新插入的元]]></description><category></category></item><item><title><![CDATA[C++ Primer第五版练习题11.16]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/108194214</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/108194214</guid><author>CoAAColA</author><pubDate>Mon, 24 Aug 2020 10:28:51 +0800</pubDate><description><![CDATA[练习 11.16：使用一个map迭代器编写一个表达式，将一个值赋予一个元素。

我们可以使用map的find函数：
int main(int argc, char *argv[]){
	map&lt;string, int&gt; mp;
	string s;
	int num;
	while (cin &gt;&gt; s &gt;&gt; num) {
		auto iter = mp.find(s);
		if (iter == mp.end()) {
			mp.insert({s, num});
]]></description><category></category></item><item><title><![CDATA[C++ Primer第五版练习题10.37]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/108175028</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/108175028</guid><author>CoAAColA</author><pubDate>Sat, 22 Aug 2020 21:45:50 +0800</pubDate><description><![CDATA[**练习 10.37：**给定一个包含10个元素的vector，将位置3到7之间的元素按逆序拷贝到一个list中。
第一眼看到这题时，竟然还想了一会怎么获得特定位置的迭代器。。
由于我们可以用一个迭代器范围来初始化一个容器，只需满足范围中元素的类型与被初始化容器的元素类型相容即可，因此，我们可以获得对应位置的迭代器并转换成反向迭代器即可：

int main(int argc, char *argv[]) {
	vector&lt;int&gt; vec;
	for (int i = 0; i &lt; 1]]></description><category></category></item><item><title><![CDATA[C++适配器重载默认容器类型]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/108045022</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/108045022</guid><author>CoAAColA</author><pubDate>Sun, 16 Aug 2020 22:01:07 +0800</pubDate><description><![CDATA[C++适配器重载默认容器类型

最近在看Prime C++，书中第329页中提到在创建一个适配器时将一个命名的顺序容器作为第二个类型参数，来重载默认容器类型。
起初看到这句话时，还不是很能理解这个重载默认容器类型是什么意思，再看了一遍书才明白：三种适配器都有自己的默认容器类型，可以理解为是基于什么实现的，比如：默认情况下，stack和queue是基于deque实现的，priority_queue是基于vector实现的。但在不同的情况下，不同的容器类型有各自的优势，因此，我们有时可能需要将适配器的容器类型重]]></description><category></category></item><item><title><![CDATA[c++primer第五版练习题3.19]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/107436896</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/107436896</guid><author>CoAAColA</author><pubDate>Sat, 18 Jul 2020 22:58:41 +0800</pubDate><description><![CDATA[练习3.19：如果想定义一个含有10个元素的vector对象，所有元素的值都是42，请列举出三种不同的实现方法。哪种方法更好呢？为什么？


vector&lt;int&gt; v1(10, 42);
vector&lt;int&gt; v2{ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, };
vector&lt;int&gt; v3 = { 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, };
vector&lt;int&gt; v4(.]]></description><category></category></item><item><title><![CDATA[Codeforces Global Round 8 A~D]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/106847002</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/106847002</guid><author>CoAAColA</author><pubDate>Fri, 19 Jun 2020 01:24:04 +0800</pubDate><description><![CDATA[E题不会了，提前写一下博客。（不保证一定正确，

A. C+=

题意：给你两个数a, b，你可以执行操作：a += b 或者 b += a。问最少执行多少次操作之后，a，b中的至少一个数大于给定的n。

思路：每一次操作改变a，b中的小值即可，因为a+b对两者是一样的。

代码：


#include &lt;iostream&gt;
 
using namespace std;
 
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.]]></description><category></category></item><item><title><![CDATA[python中的jieba分词保留给定词汇]]></title><link>https://blog.youkuaiyun.com/CoAAColA/article/details/106689169</link><guid>https://blog.youkuaiyun.com/CoAAColA/article/details/106689169</guid><author>CoAAColA</author><pubDate>Thu, 11 Jun 2020 15:05:13 +0800</pubDate><description><![CDATA[之前在做python的词云作业时，希望保留一些特定的词汇，但在网上没有找到方法，今天在上python课的时候老师给出了解答：

首先，调用jieba.load_userdict(文件名)，加载需要保留的词汇，文件内容是需要保留的词汇，然后使用jieba.lcut(text)即可对给定的文本进行分析，即可得到结果。

代码：


def cut_by_custom_dict(text=None):
    jieba.load_userdict('../data/user_dict.txt')
    ret]]></description><category></category></item></channel></rss>