C++关于类模板(vector)的问题。

今天写了一段代码要求实现:
从标准输入读取字符串并将他们存储为类模板(vector)对象,并从类模板中将其输出。
程序编译后提示有4个警告如下:
warningC4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> >*,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,int>' : identifier was truncated to '255' chara
cters in the debug information
我是初学者,这个警告好像是内存出了问题,请大家帮我大概解释一下这里的提示是什么意思。
还有一个问题,我可能是少引用了一个std命名空间中的操作,所以在编译过程中总是出错,但是加上using namespace std;后就能编译通过了。请大家帮我看一下是缺了哪个std中的操作。
代码如下:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main()
{
vector<string> text;
string word;
while(cin>>word)
{
text.push_back(word);
}
for(vector<int>::size_type index=0;index!=text.size();index++)
cout<<text[index]<<" ";
cout<<endl;
return 0;
}
还有我刚开始学习C++,代码中有什么其他的不足希望大家多多斧正。

main函数的应用程序的入口函数,不能定义成模板函数。
模板函数模板类都是在调用(或者实例化)的时候,被指定了参数类型之后才生成真正的代码的。可以查相关的书籍《thinking in C++》《stl 源码剖析》等。
你改了main函数的原型,当然会出现链接错误。

vector本身是模板类,你可以指定任意的类型装进去。
作为模板类,vector能够保存“任意类型”的数据,是指相对于vector这个类来说,他不关心保存的是什么类型的。但是当你实例化一个vector的时候,你就需要确定一个参数类型,这样你才能拥有一个可以用来实例化一个具体对象的类类型,比如vector<int>,vector<string>,vecor<Dog>等。

任意类型是相对于模板类的,不是相对于应用程序。对于一个应用程序,他的逻辑是确定的,他能处理的数据类型也是确定的。即使是某些可以产生随意性结果的程序,他的逻辑在一定程度上也是确定的。

我不知道我说没说清楚,如果还有问题,请提出。
追问

main函数的应用程序的入口函数指的是while(cin>>word){text.push_back(word);}吗?如果是的话说他不能定义成模板函数,这是为什么呢?这样做程序可以正常运行,会带来哪些潜在的威胁呢?还有您推荐的以查相关的书籍《thinking in C++》《stl 源码剖析》在网上可以找到电子版吗?或者哪些是值得推荐仔细研读的。不然为了一个问题去买两本书个人觉得有点事倍功半的意思。望指教。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-13
可以去掉using namespace std,因为程序中你用到的std名字空间的类型都用了using指示声明,这是可以做到的。至于你说编写头文件时,用std::使用std名字空间中的类型,这是为了防止std在头文件中滥用而造成“名字污染”,这刚好和引进名字空间的目的相反,事与愿违了!
第2个回答  2011-09-08
warningC4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> >*,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,int>' : identifier was truncated to '255' chara
cters in the debug information
在调试信息里,标识符'std::reverse_ite........................cator<char> > *,int>'被截断到255个字符
_________
我这不用using namespace std;没事啊, 除了vc6,
你多加个using std::vector<int>; 试试
不过text是vector<string>的啊, 你用vector<int>::size_type干嘛?
用vector<string>::size_type; 和using std::vector<string>;

或者你换个高版本的或其他的编译器试试
第3个回答  推荐于2016-03-27
你的代码没什么大问题,只是有两个地方需要修改一下,如下(见注释):
=====================================================
#include<iostream>
#include<string>
#include<vector>
using namespace std;//只需要使用此句就可以了
//using std::cin;
//using std::cout;
//using std::endl;
//using std::string;
//using std::vector;
int main()
{
vector<string> text;
string word;
//while(cin>>word;)//cin>>word执行后返回的类型为istream类型,一般不能通过判断它的执行结果来控制循环
//应该在循环内部判断输入的值来控制是否退出循环
while(true)
{
cin>>word;
text.push_back(word);
//如果输入"exit"则退出
if ( word.compare("exit")==0)
{
break;
}
}
for(vector<int>::size_type index=0;index!=text.size();index++)
cout<<text[index]<<" ";
cout<<endl;

return 0;
}追问

我知道使用using namespace std;是包含下面的操作,只是在编写头文件的时候,所有的引用于std的操作需要通过using std::XXX的方式声明。我想知道如果去掉using namespace std;而全部改为using std::XXX声明,我的代码中缺少什么。

追答

我试过了,目前你代码里面不用using namespace std;采用你的方式也能编译和执行,不缺少什么.

本回答被提问者采纳
第4个回答  推荐于2018-03-28
#include <iostream>
#include <algorithm>
#include <iterator>
int main(int argc, char* argv[])
{
std::copy(&argv[1],&argv[argc],
std::ostream_iterator<char*>(std::cout,"\t"));

return argc != 1;
}
比你写的简单多了。本回答被网友采纳

高分求助一个C++问题(急!!!)
1、vector是模板类,必须指定类型才能用,比如vector<long> 2、array是保留字,不能用作变量名,至少在vc2008下是这样的,所以我改成了my_array 3、vector::size_type,同1问题,也得给出类型vector<long>::size_type 4、 for(vector::size_type i=array.size();i>=0;--i)这句判断是有问...

C++,vector模板类的问题? std::vector<PointT, Eigen::aligned_allocator...
template< class T, class Allocator = std::allocator<T>> class vector;有两个模板参数,T 是元素类型,而 Allocator 负责提供 vector 需要用到的动态内存。其中 Allocator 参数有默认值,一般的使用不需要指定这个参数。但有时对内存有特殊需求,就需要提供自己定义的内存管理类。把容器操作和...

C++:vector对象的初始化
C++中的vector类是一个容器,专门用于存储同类型的对象,每个对象都有唯一的索引。它实际上是编译器根据模板生成的,模板是一种编译时的抽象,实例化时会指定生成的具体类型。初始化vector对象的方式与string相似,常见的有拷贝初始化和列表初始化。拷贝初始化通过圆括号传递,如v1,它的容量被初始化。而...

求C++大神解答一下关于vector的小问题
大概就是这个意思吧。第一个输出的是1,因为a可以表示数组的第一个元素的地址,所以可以像指针一样解引用然后使用(相应的*(a+1)输出的就是2)。而vector对象vi是一个模版类对象,没有重载*号,不能像指针一样使用。

C++ vector用法是什么?
vector容器类型\\x0d\\x0a vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象)。vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的。\\x0d\\x0avector的构造\\x0d\\x0a \\x0d\\x0a函数原型:\\x0d\\x0atemplate\\x0d\\x0a explicit vector(); \/\/ ...

c++中vector容器是一个模板类,可以存放任何类型的对象请问存放的到底...
看你具体存放的类型,如果是普通值类型如(int,double)等,存的就是它的值。如果是指针类型(int*,void*)等,也一样就是这个指针。如果是类类型如(std::string)等,就是它个一份拷贝。

C++类内包含vector成员变量,vector中的元素存储在堆区还是栈区?_百度...
new T就是在堆区创建一个类T的对象,因为v是类T的数据成员,v自然是存放在堆区。delete p时v会自动释放。

C++类模板问题
vector<T> data, int maxsize);vector<T> getData();};template <class T>Stack<T>::Stack(vector<T> data, int maxsize):_data(data), _maxsize(maxsize){}template <class T>vector<T> Stack<T>::getData(){return _data;}\/\/给你写了个大概,你按照这个根据自己需求再写写看 ...

C++中vector使用不当出现的错误
vector内部有一个指向分配了的内存的指针 你copy过去造成多个vector指向堆上同一块内存 这样在析构的时候就会对同一块内存释放两次 出错是在所难免的 STL容器的使用原则之一就是:不要使用CopyMemory,memcpy之类的函数来作无差别拷贝,毕竟容器不是单纯的C结构体 ...

c++ 中的&vector和&vector[0]为什么不相同?
vector是一个模板类,像这样声明的:template<typename t> class vector { \/\/...};而你代码中的v是将类型参数t指定为int类型时的这个类的一个对象,&v是一个对象的地址,它的类型是vector<int>*,而&v[0]是一个int类型的变量的地址,它的类型是int*,它们当然不相同。

相似回答