更新中——上次更新(2023.07.13-23:07)
迭代器(iterator)
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> e;
std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(e));
std::vector<int>::iterator first = std::find(e.begin(), e.end(), 1);
std::vector<int>::iterator last = std::find(e.begin(), e.end(), 3);
/*错误一:
当e中不存在3的时候,last等于e.end(),这个值是不能被解引用的
*/
std::copy(first, last, std::ostream_iterator<int>(std::cout, ","));
/**
* 错误二:
* 这里也有问题 因为first可能再last之后,copy中first必须再last之前。[first, last)
*/
e.insert(--e.end(), 9);
/**
* --end():
* 错误一,应该写成e.end() - 1,这个我没看懂,后面看下 懂了补上。。。
* 错误二:如果e是空的,那么不管写成--e.end()还是e.end()- 1 都是错的
*/
std::cout << std::endl;
std::copy(first, last, std::ostream_iterator<int>(std::cout, ","));
/**
* first和last可能已经不是有效的迭代器了,因为vector再插入一个元素后可能会发生重新分配内存的情况,这样就会导致first和last失效了。
*/
return 0;
}
在使用迭代器时,我们需要注意:
- 迭代器的有效值:这个迭代器可以被解引用吗?
- 迭代器的有效生存期:在使用的时候这个迭代器还是有效的吗?
- 迭代器的有效范围:两个迭代器是否能构成一个有效范围
- 对内置类型的非法操作:程序是否尝试修改一个临时变量
大小写不敏感的字符串之一
下面实现一个ci_string,和string的区别是ci_string对大小写不敏感
因为string的定义:
所以string = basic_string<char, char_traits<char>, allocator<char>>
又因为字符串比较相关的逻辑在char_traits中,所以就只要写一个类去继承char_traits就好,然后把关键的函数重写一下。所以就有了下面的代码。(这种方式也有弊端,下一部分考虑,这里暂不考虑)
#include <string>
#include <iostream>
struct ci_char_traits : public std::char_traits<char>
{
static bool eq(char char1, char char2)
{
return toupper(char1) == toupper(char2);
}
static bool lt(char char1, char char2)
{
return toupper(char1) <= toupper(char2);
}
static int compare(const char *s1, const char *s2, size_t n)
{
for (size_t i = 0; i < n; i++)
{
if (toupper(s1[i]) < toupper(s2[i]))
{
return -1;
}
else if (toupper(s1[i]) > toupper(s2[i]))
{
return 1;
}
}
return 0;
}
static const char *find(const char *s, int n, char a)
{
while (n-- > 0 && toupper(*s) != toupper(a))
{
++s;
}
return n >= 0 ? s : 0;
}
};
typedef std::basic_string<char, ci_char_traits> ci_string;
int main()
{
ci_string s1 = "A";
ci_string s2 = "a";
if (s1 == s2)
{
std::cout << "相等" << std::endl;
}
return 0;
}
大小写不敏感的字符串之二
TODO: 待更新