- 字符串表示的进制转换函数:stoi函数
int stoi( const std::string& str, std::size_t* pos = nullptr, int base = 10 );
参数:
str – 待转换的字符
pos – 其取值可以是一个空字符,在这种情况下,pos未被使用;另外如果pos不是空指针,函数将pos的值设置为str中数字后面的第一个字符的位置。
base – 字符中数字的进制,默认为10进制,如果base取值为0,则进制由字符串中的格式决定。
返回值:
如果转换成功的话,stoi函数将会把转换后的得到数字以int类型返回。
如果字符串中没有数字的话,将会抛出”invalid_argument”的异常;
如果字符串中的数字转换后超过int的范围,将会抛出”out_of_range”的异常;
因此使用stoi函数的时候最好加入异常处理。
2. 全排列函数:next_permutation
是一个原地算法(会直接改变这个集合,而不是返回一个集合),它对一个可以遍历的集合(如string,如vector),将迭代器范围 [first, last] 的排列 排列到下一个排列(第一个是名词,第二个是动词,第三个是名词),其中所有排列的集合默认按照operator
听起来有点抽象,我们直接举个很简单的例子,字符串“123”的按照字典序正确的全排列是:
“123” “132” “213” “231” “312” “321”
如果我们想得到一个序列的完整全排列,可以这样
#include
#include
#include
using namespace std;
int main() {
vector chars = {'a', 'b', 'c'};
do {
cout
输出结果为
abc
acb
bac
bca
cab
cba
如果从bac开始 遍历的话 只有 bac bca cab cba 而没有 abc acb
3. 自动排序函数:set
定义于头文件
底层实现通常是平衡二叉树
元素自动排序,这为查找元素提供了良好性能,但同时也造成了一个重要限制:不能直接改变元素值,因为这会打乱原本正确的顺序
查找函数具有对数复杂度
要改变元素的值,必须先删除该元素,再插入新元素
使用示例如下:
// Program to print elements of set
#include
using namespace std;
int main()
{
set s;
s.insert(5);
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(7);
s.insert(2);
cout
输出结果:
Elements of set in sorted order:
1 2 3 5 6 7
4. unordered_map与map
unordered_map
在头文件上,引入 来使用它。对于 unordered_map 而言,最大的特点在于内部实现上,使用到了「哈希表」(散列表、hash_table )来进行映射存储,它的模板类声明及其参数如下:
/**
程序来自STL源码 bits/unordered_map.h
*/
template
typename _Tp, // value 类型
typename _Hash = hash , // 哈希函数
typename _Pred = equal_to , // 用于比较两者是否相同的函数
typename _Alloc = allocator >> // 分配器,描述了容器在内存管理上的细节,不应该自己来处理,除非写自己的容器
class unordered_map {
};
在 unordered_map 内部,使用的 Hash Table 对数据进行组织,通过把键值 key 映射到 hash 表中的一个位置进行访问,根据 hash 函数的特点, unordered_map 对于元素查找的时间复杂度可以达到 O(1) ,但是,它的元素排列是无序的。具体例子如下:
int main() {
using namespace std;
// 首先创建一个无序 map,它的 key 使用 int 类型,value 使用 string 类型
unordered_map unorderedMap;
// 三种插入新元素的方法,“茴”字有三种写法~
unorderedMap.insert(make_pair(0, "Alice"));
unorderedMap[1] = "Bob";
unorderedMap.insert(unordered_map::value_type(2, "Candy"));
// 对内部元素挨个输出
for (auto iter = unorderedMap.begin(); iter != unorderedMap.end(); iter++) {
cout first second : 输出如下,可以得知它们在 key 的排序上并没有顺序
* 2 - Candy
* 0 - Alice
* 1 - Bob
*/
}
}
unordered_map 由于建立了哈希表,所以它在最开始建立的时候比较耗时间,但是它查询速度快呀~,一般情况下用 unordered_map 是没有问题的。
map
对于 map 而言,首先在头文件上,引用 进来,然后使用。它的类模板声明以及部分函数声明如下:
/**
程序来自C++源码 bits/stl_map.h
*/
template
typename _Tp, // value 类型
typename _Compare = std::less, // 用于比较两个元素的比较函数
typename _Alloc = std::allocator > > // 分配器,同样的描述了容器在内存管理上的细节,不应该自己来处理,除非写自己的容器
class map {
private:
/// 将一个红黑树转换成 [multi]map.
typedef typename __gnu_cxx::__alloc_traits::template
rebind::other _Pair_alloc_type;
typedef _Rb_tree,
key_compare, _Pair_alloc_type> _Rep_type;
};
在 map 的内部,使用了「红黑树」(red-black tree)来组织数据,因此默认的就已经实现了数据的排序。从下面例子中可以看出,它默认实现了在 key 上排序实现递增:
int main() {
map mapper;
mapper.insert(make_pair(0, "Alice"));
mapper[1] = "Bob";
mapper.insert(map::value_type(2, "Candy"));
for (auto &iter : mapper) {
cout : 输出如下,很明显的,它们在 key 的排序上是递增排列的
* 0 - Alice
* 1 - Bob
* 2 - Candy
*/
}
}
不过,在存储上 map 却比较占用空间,因为在红黑树中,每一个节点都要额外保存父节点和子节点的连接,因此使得每一个节点都占用较大空间来维护红黑树性质。
find_first_of和find_last_of
1、find_first_of()函数
正向查找在原字符串中第一个与指定字符串(或字符)中的某个字符匹配的字符,返回它的位置。若查找失败,则返回npos。(npos定义为保证大于任何有效下标的值。)
2、find_last_of()函数
逆向查找在原字符串中最后一个与指定字符串(或字符)中的某个字符匹配的字符,返回它的位置。若查找失败,则返回npos。(npos定义为保证大于任何有效下标的值。)
tails/104375849
#include
using namespace std;
int main() {
string str1, str2;
cin >> str1 >> str2;
//利用字符串字典,解密与加密
string a("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
string b("BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza1234567890");
for (int i = 0; i
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
随着国内外市场的不断开放和消费升级,越来越多的消费者开始选择海外代购,寻求更具性价比和个性化的商品选购方式。因此,代购业务也如雨后春笋般发展起来,成为了一个广受欢迎的行业。 代购系统是为了满足消费者的需要而诞生的,通过该系统,消费者可以更便捷地搜索到所需商品,…