Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的迭代器类设计+; 我试图学习C++中泛型迭代器的概念。我遇到了下面给出的这个例子。我不明白在这里使用namecolection::value\u type有什么用。为什么我们不能 迭代器,因为它是一个模板类 #include<iostream> #include<vector> using namespace std; template<typename T> class Iterator { public: typedef T value_type; virtual bool hasNext() = 0; virtual T next() = 0; }; class NameManager { typedef vector<string> NameCollection; NameCollection m_names; public: class NameIterator: public Iterator< NameCollection::value_type > { friend class NameManager; private: NameManager::NameCollection & m_names; NameManager::NameCollection::iterator m_itr; NameIterator(NameManager::NameCollection & names) : m_names(names), m_itr(m_names.begin()) {} public: virtual bool hasNext() { return m_itr!=m_names.end(); } virtual NameIterator::value_type next(void) { NameIterator::value_type value = (*m_itr); ++m_itr; return value; } }; void addName(NameCollection::value_type name){ m_names.push_back(name); } NameIterator getNameIterator(void) { return NameIterator(m_names); } }; int main(void) { NameManager nameMgr; nameMgr.addName("Jobs"); nameMgr.addName("Bill"); nameMgr.addName("Larry"); NameManager::NameIterator nameItr = nameMgr.getNameIterator(); while(nameItr.hasNext()) { cout<<nameItr.next() << endl; } return 0; } #包括 #包括 使用名称空间std; 模板 类迭代器{ 公众: 类型定义T值_类型; 虚拟布尔hasNext()=0; 虚拟T next()=0; }; 类名管理器{ typedef矢量名称集合; 名称集合m_名称; 公众: 类名称迭代器:公共迭代器{ 朋友班经理; 私人: NameManager::NameCollection&m_名称; NameManager::NameCollection::迭代器m_itr; NameIterator(NameManager::NameCollection&names):m_names(names),m_itr(m_names.begin()){} 公众: 虚拟布尔hasNext(){ 返回m_itr!=m_names.end(); } 虚拟名称迭代器::值\键入下一个(void){ NameIterator::value_type value=(*m_itr); ++m_itr; 返回值; } }; void addName(名称集合::值\类型名称){ m_名称。推回(名称); } NameIterator getNameIterator(无效){ 返回名称迭代器(m_名称); } }; 内部主(空){ 姓名经理姓名经理; 名称管理者地址名称(“职务”); 名称管理人地址名称(“法案”); 姓名经理地址姓名(“拉里”); NameManager::NameIterator nameItr=nameMgr.getNameIterator(); while(nameItr.hasNext()){ cout_C++_Templates_Vector_Iterator - Fatal编程技术网

C+中的迭代器类设计+; 我试图学习C++中泛型迭代器的概念。我遇到了下面给出的这个例子。我不明白在这里使用namecolection::value\u type有什么用。为什么我们不能 迭代器,因为它是一个模板类 #include<iostream> #include<vector> using namespace std; template<typename T> class Iterator { public: typedef T value_type; virtual bool hasNext() = 0; virtual T next() = 0; }; class NameManager { typedef vector<string> NameCollection; NameCollection m_names; public: class NameIterator: public Iterator< NameCollection::value_type > { friend class NameManager; private: NameManager::NameCollection & m_names; NameManager::NameCollection::iterator m_itr; NameIterator(NameManager::NameCollection & names) : m_names(names), m_itr(m_names.begin()) {} public: virtual bool hasNext() { return m_itr!=m_names.end(); } virtual NameIterator::value_type next(void) { NameIterator::value_type value = (*m_itr); ++m_itr; return value; } }; void addName(NameCollection::value_type name){ m_names.push_back(name); } NameIterator getNameIterator(void) { return NameIterator(m_names); } }; int main(void) { NameManager nameMgr; nameMgr.addName("Jobs"); nameMgr.addName("Bill"); nameMgr.addName("Larry"); NameManager::NameIterator nameItr = nameMgr.getNameIterator(); while(nameItr.hasNext()) { cout<<nameItr.next() << endl; } return 0; } #包括 #包括 使用名称空间std; 模板 类迭代器{ 公众: 类型定义T值_类型; 虚拟布尔hasNext()=0; 虚拟T next()=0; }; 类名管理器{ typedef矢量名称集合; 名称集合m_名称; 公众: 类名称迭代器:公共迭代器{ 朋友班经理; 私人: NameManager::NameCollection&m_名称; NameManager::NameCollection::迭代器m_itr; NameIterator(NameManager::NameCollection&names):m_names(names),m_itr(m_names.begin()){} 公众: 虚拟布尔hasNext(){ 返回m_itr!=m_names.end(); } 虚拟名称迭代器::值\键入下一个(void){ NameIterator::value_type value=(*m_itr); ++m_itr; 返回值; } }; void addName(名称集合::值\类型名称){ m_名称。推回(名称); } NameIterator getNameIterator(无效){ 返回名称迭代器(m_名称); } }; 内部主(空){ 姓名经理姓名经理; 名称管理者地址名称(“职务”); 名称管理人地址名称(“法案”); 姓名经理地址姓名(“拉里”); NameManager::NameIterator nameItr=nameMgr.getNameIterator(); while(nameItr.hasNext()){ cout

C+中的迭代器类设计+; 我试图学习C++中泛型迭代器的概念。我遇到了下面给出的这个例子。我不明白在这里使用namecolection::value\u type有什么用。为什么我们不能 迭代器,因为它是一个模板类 #include<iostream> #include<vector> using namespace std; template<typename T> class Iterator { public: typedef T value_type; virtual bool hasNext() = 0; virtual T next() = 0; }; class NameManager { typedef vector<string> NameCollection; NameCollection m_names; public: class NameIterator: public Iterator< NameCollection::value_type > { friend class NameManager; private: NameManager::NameCollection & m_names; NameManager::NameCollection::iterator m_itr; NameIterator(NameManager::NameCollection & names) : m_names(names), m_itr(m_names.begin()) {} public: virtual bool hasNext() { return m_itr!=m_names.end(); } virtual NameIterator::value_type next(void) { NameIterator::value_type value = (*m_itr); ++m_itr; return value; } }; void addName(NameCollection::value_type name){ m_names.push_back(name); } NameIterator getNameIterator(void) { return NameIterator(m_names); } }; int main(void) { NameManager nameMgr; nameMgr.addName("Jobs"); nameMgr.addName("Bill"); nameMgr.addName("Larry"); NameManager::NameIterator nameItr = nameMgr.getNameIterator(); while(nameItr.hasNext()) { cout<<nameItr.next() << endl; } return 0; } #包括 #包括 使用名称空间std; 模板 类迭代器{ 公众: 类型定义T值_类型; 虚拟布尔hasNext()=0; 虚拟T next()=0; }; 类名管理器{ typedef矢量名称集合; 名称集合m_名称; 公众: 类名称迭代器:公共迭代器{ 朋友班经理; 私人: NameManager::NameCollection&m_名称; NameManager::NameCollection::迭代器m_itr; NameIterator(NameManager::NameCollection&names):m_names(names),m_itr(m_names.begin()){} 公众: 虚拟布尔hasNext(){ 返回m_itr!=m_names.end(); } 虚拟名称迭代器::值\键入下一个(void){ NameIterator::value_type value=(*m_itr); ++m_itr; 返回值; } }; void addName(名称集合::值\类型名称){ m_名称。推回(名称); } NameIterator getNameIterator(无效){ 返回名称迭代器(m_名称); } }; 内部主(空){ 姓名经理姓名经理; 名称管理者地址名称(“职务”); 名称管理人地址名称(“法案”); 姓名经理地址姓名(“拉里”); NameManager::NameIterator nameItr=nameMgr.getNameIterator(); while(nameItr.hasNext()){ cout,c++,templates,vector,iterator,C++,Templates,Vector,Iterator,假设您正在编写泛型代码,它应该能够与任何(或至少是泛型)迭代器一起工作。从中思考一些问题。这样的代码可能对值的类型感兴趣(表达式的类型*it)因此,value\u typetypedef是传递此信息的标准接口 当然,NameCollection::value_类型是std::string。它可以起到相同的作用:假设您希望将底层容器更改为使用宽字符串或其他内容。现在,如果明确使用std::string,则必须到处查找并替换它。如果使用NameCollection::value_类型,则只需更改一

假设您正在编写泛型代码,它应该能够与任何(或至少是泛型)迭代器一起工作。从
中思考一些问题。这样的代码可能对值的类型感兴趣(表达式的类型
*it
)因此,
value\u type
typedef是传递此信息的标准接口


当然,NameCollection::value_类型是std::string。它可以起到相同的作用:假设您希望将底层容器更改为使用宽字符串或其他内容。现在,如果明确使用std::string,则必须到处查找并替换它。如果使用NameCollection::value_类型,则只需更改一行


您也可以在函数“next”中使用它(它将起作用),但从语义上讲,在那里使用迭代器更有意义,因为这个函数都是关于迭代器的。

不清楚您看到的是什么类型的问题。您希望用什么来代替
namecolection::value\u type
我不理解在这里使用namecolection::value\u type的用法terator:public迭代器
只翻译成
namediator:public迭代器
,因为
NameCollection
是一个
std::vector
value\u type
引用传入的
T
模板参数(
std::string
)…我不清楚的是,
NameManager
类试图通过教授泛型迭代器来完成什么..它只是包装了
std::vector
的功能,并以不同的方式呈现..@n.m.我不明白nametitor:public Iterator和nametitoro之间的区别是什么r:public Iterator没有全局
value\u type
Iterator
可能是什么意思?@n.m.NameCollection::value\u type语句是否隐式表示迭代器是std::string,因为我们有一个向量?我理解为什么有value\u type。我的问题是NameCollection::value\u type是什么e是指?它在迭代器表达式中以及在函数addName中使用。同样在下一个函数中,为什么我们需要NameIterator::value_type value,我们可以在那里使用NameCollection吗?