热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++STL学习(6)其他容器(string,array,hashtable等)

注:博客内容均来自于对《C++标准库》侯捷,华中科技大学出版社一书的笔记。转载请注明出处。所有例程在RedHatLinux3.2.2-5版本上编译运行,g++的版

注:博客内容均来自于对《C++标准库》侯捷,华中科技大学出版社一书的笔记。转载请注明出处。

所有例程在Red Hat Linux 3.2.2-5版本上编译运行,g++的版本是 g++ (GCC) 3.2.2 20030222。





1、string作为容器使用    string是C++标准程序库的一种型别,是用 “侵入性作法编写STL容器”的一个例子。string可被视为以字符为元素的一种容器。字符可以构成序列,可以在序列上来回移动遍历。因此,标准的string提供STL容器接口。string也提供成员函数begin()和end(), 返回随机存取迭代器,可用来遍历整个string。同时为了迭代器和迭代配接器,string也提供一些操作函数:push_back()。string支持的迭代器操作如下表所示:



#include 
#include
#include
#include
using namespace std;


int main(int argc, char *argv[])
{
string s("The zip code of Hondelage in Germany id 38108");
cout <<"original: " <transform(s.begin(), s.end(), //源字串
s.begin(), //目标位置
::tolower); //仿函数
cout <<"lowered: " <
transform(s.begin(), s.end(), //源字串
s.begin(), //目标位置
::toupper); //仿函数
cout <<"uppered: " <return 0;
}
运行结果:

上述程序中,仿函数带入的时候使用的是: ::tolower() ,这是因为这里支持此操作的是在全局区的C版本标准库函数。


2、Array作为容器使用

print.h

#ifndef __PRINT_H
#define __PRINT_H

#include
#include

template
void PRINT_ELEMENTS(const T& coll, const char* optcstr = " ")
{
typename T::const_iterator pos;
std::cout <for(pos = coll.begin(); pos != coll.end(); ++pos)
{
std::cout <<*pos <<' ';
}
std::cout <}

#endif
carray.h
#ifndef __CARRAY_H
#define __CARRAY_H

#include

template
class carray
{
private:
T v[thesize];
public:
typedef T value_type;
typedef T* iterator;
typedef const T* const_iterator;
typedef T& reference;
typedef const T& const_reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;

iterator begin()
{
return v;
}

const_iterator begin() const
{
return v;
}

iterator end()
{
return v + thesize;
}

const_iterator end() const
{
return v + thesize;
}

reference operator[] (std::size_t i)
{
return v[i];
}

const_reference operator[] (std::size_t i) const
{
return v[i];
}

size_type size() const
{
return thesize;
}

T* as_arry()
{
return v;
}
};

array.cpp

#include 
#include
#include
#include "carray.h"
#include "print.h"


using namespace std;

int main(int argc, char *argv[])
{
carray a;
for(unsigned i = 0; i {
a[i] = i + 1;
}
PRINT_ELEMENTS(a);
reverse(a.begin(), a.end(),
a.begin(),
negate());
PRINT_ELEMENTS(a);
return 0;
}

3、实现Reference语义

countptr.h

#ifndef __COUNTPTR_H
#define __COUNTPTR_H

template
class CountedPtr
{
private:
T* ptr;
long* count;
public:
explicit CountedPtr(T* p=0)
: ptr (p) , count (new long(1))
{
}

CountedPtr (const CountedPtr& p) throw()
: ptr(p.ptr), count(p.count)
{
++*count;
}
~CountedPtr () throw()
{
dispose();
}

CountedPtr& operator= (const CountedPtr& p) throw()
{
if(this != &p)
{
dispose();
ptr = p.ptr;
count = p.count;
++*count;
}
return *this;
}

T& operator*() const throw()
{
return *ptr;
}

T* operator->() const throw()
{
return ptr;
}

private:
void dispose()
{
if(--*count == 0)
{
delete count;
delete ptr;
}
}
};


#endif //__COUNTPTR_H

refsem.cpp

#include 
#include
#include
#include
#include "countptr.h"
using namespace std;

void printCountedPtr(CountedPtr elem)
{
cout<<*elem <<' ';
}


int main(int argc, char *argv[])
{
static int values[] = {3, 5, 9, 1, 6, 4};

typedef CountedPtr IntPtr;
deque col1;
list col2;

for(int i=0; i{
IntPtr ptr(new int(values[i]));
col1.push_back(ptr);
col2.push_front(ptr);
}

for_each(col1.begin(), col1.end(),
printCountedPtr);
cout <
for_each(col2.begin(), col2.end(),
printCountedPtr);
cout <
*col1[2] *= *col1[2];
(**col1.begin()) *= -1;
(**col2.begin()) *= 0;

for_each(col1.begin(), col1.end(),
printCountedPtr);
cout <
for_each(col2.begin(), col2.end(),
printCountedPtr);
cout <
return 0;
}




注:博客内容均来自于对《C++标准库》侯捷,华中科技大学出版社一书的笔记。转载请注明出处。

所有例程在Red Hat Linux 3.2.2-5版本上编译运行,g++的版本是 g++ (GCC) 3.2.2 20030222。




推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • 初步认识虚函数(一)
    首先,虚函数是这么定义的,简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象 ... [详细]
  • IamtryingtowriteaC++programinwhichwhenuserenteranycharacterfromkeyboardanditshoul ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 类Hashtable<K,V>所有已实现的接口:Serializable,Cloneable,Map<K,V>此类实现一个哈希表,该哈希表将键映 ... [详细]
  • 我有一个xml文件,里面的数据想放入自定义类里存入HashTable里面,不知道有没有哪为高手有这方面的例子,希望能解小弟一时之困!谢谢! ... [详细]
  • 一、HashMap1.HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是 ... [详细]
  • 要讨论这些常用的默认初始容量和扩容的原因是:当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复 ... [详细]
  • 常用API-Hashtable类及其与HashMap、HashSet的区别转载请表明出处:http:blog.csdn.netu012637501(嵌入式_小J的天空)一、Hashtable&l ... [详细]
author-avatar
信步老街
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有