
c++ vector问题求解
C++在编写联系程序的时候编译通过,运行是跳出这样一个提示框,求解用的是VisualStudio2010#include<iostream>#include<vector...
C++在编写联系程序的时候编译通过,运行是跳出这样一个提示框,求解
用的是Visual Studio 2010
#include<iostream>
#include<vector>
using namespace std;
void indata(vector<int>);
void outdata(vector<int>);
void main()
{
vector<int> ivec(1);
indata(ivec);
outdata(ivec);
}
void indata(vector<int> ivec)
{
int num;
cout<<"input data"<<endl;
cin>>num;
for(vector<int>::iterator iter=ivec.begin();num!=-1;++iter)
{
ivec.push_back(num);
}
}
void outdata(vector<int>ivec)
{
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
if(iter!=ivec.begin())
{
cout<<*iter+*(iter-1)<<endl;
}
}
}
源程序如上,貌似没有99行。。。 展开
用的是Visual Studio 2010
#include<iostream>
#include<vector>
using namespace std;
void indata(vector<int>);
void outdata(vector<int>);
void main()
{
vector<int> ivec(1);
indata(ivec);
outdata(ivec);
}
void indata(vector<int> ivec)
{
int num;
cout<<"input data"<<endl;
cin>>num;
for(vector<int>::iterator iter=ivec.begin();num!=-1;++iter)
{
ivec.push_back(num);
}
}
void outdata(vector<int>ivec)
{
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
if(iter!=ivec.begin())
{
cout<<*iter+*(iter-1)<<endl;
}
}
}
源程序如上,貌似没有99行。。。 展开
4个回答
展开全部
前段时间做图算法的project,刚刚开始使用迭代器,一些细节没有主意,编译的时候就报错“list iterator not incrementable”。当时自己对迭代器的操作是erase,网上搜到得解释是:“erase中会将迭代器销毁掉.这样在erase之后,iter的指向已经乱了,debug可以看到开始是从1开始的,过后就是负多少了.所以会报错“list iterator not incrementable.”
今天看书就颇详细的对迭代器做了介绍。主要有几点当时使用的时候不知道的。先做个定义
vector<int> num;
vector::iterator iter;
1、iterator的end操作:由end操作返回的迭代器只想vector的“末端元素的下一个”。(当初自己认为end指向的是最后一个元素=。=!)通常称为超出末端迭代器,表明它指向了一个不存在的元素。end操作返回的迭代器并不指向vector中任何实际的元素,相反,只是起一个“哨兵”的作用,表示我们已经处理完vector中所有元素。同时不能对end返回的迭代器进行解引用(即*操作)或自增操作
2、*操作符:*iter返回迭代器当前指向的元素,对*iter的修改就是对迭代器所指向的元素进行修改。(当然迭代器类型非const_iterator啦,或者迭代器非const)。
3、==或!=操作符来比较迭代器,如果两个迭代器对象指向同一元素,则想都,否则不等(=。=!有点废话了)
4、书上给了个循环的范例,for (vector<int>::iterrator iter = num.begin();iter != num.end();++iter),书上对该处做了点解释,该for循环的效果是从num第一个元素开始顺序处理vector中每一个元素。最后,iter将指向num的最后一个元素,iter再增加1,就会与end操作的返回值相等,在这个情况下,循环终止。(PS:俺当时写的时候一直是n++的形式,估计迭代器失效跟这个也有关系=。=!)
5、对于vector的循环,如果vector为空,程序也是安全的。如果num为空,则begin返回的迭代器不指向任何元素元素,由于没有元素,所以begin不指向任何元素,此时,begin和end操作返回的迭代器的值相同,因此for语句中的测试条件立即失败。
最后还新认识了个const_iterator类型,迭代器只能读取容器内容,不能修改!
今天看书了解到的,稍做记录!废话不少=。=!
今天看书就颇详细的对迭代器做了介绍。主要有几点当时使用的时候不知道的。先做个定义
vector<int> num;
vector::iterator iter;
1、iterator的end操作:由end操作返回的迭代器只想vector的“末端元素的下一个”。(当初自己认为end指向的是最后一个元素=。=!)通常称为超出末端迭代器,表明它指向了一个不存在的元素。end操作返回的迭代器并不指向vector中任何实际的元素,相反,只是起一个“哨兵”的作用,表示我们已经处理完vector中所有元素。同时不能对end返回的迭代器进行解引用(即*操作)或自增操作
2、*操作符:*iter返回迭代器当前指向的元素,对*iter的修改就是对迭代器所指向的元素进行修改。(当然迭代器类型非const_iterator啦,或者迭代器非const)。
3、==或!=操作符来比较迭代器,如果两个迭代器对象指向同一元素,则想都,否则不等(=。=!有点废话了)
4、书上给了个循环的范例,for (vector<int>::iterrator iter = num.begin();iter != num.end();++iter),书上对该处做了点解释,该for循环的效果是从num第一个元素开始顺序处理vector中每一个元素。最后,iter将指向num的最后一个元素,iter再增加1,就会与end操作的返回值相等,在这个情况下,循环终止。(PS:俺当时写的时候一直是n++的形式,估计迭代器失效跟这个也有关系=。=!)
5、对于vector的循环,如果vector为空,程序也是安全的。如果num为空,则begin返回的迭代器不指向任何元素元素,由于没有元素,所以begin不指向任何元素,此时,begin和end操作返回的迭代器的值相同,因此for语句中的测试条件立即失败。
最后还新认识了个const_iterator类型,迭代器只能读取容器内容,不能修改!
今天看书了解到的,稍做记录!废话不少=。=!
参考资料: http://blog.dormforce.net/loading99/?p=111
展开全部
#include<iostream>
#include<cstring>
using namespace std;
char* trim(char *s);
char* leftstring(char *s1, char *s2, int n);
int index(char *s1, char *s2);
int main(){
char str1[]="I'm student. ",str2[]="student",str3[4];
int n;
cout<<"串str1:"<<str1<<"长度为:"<<strlen(str1)<<endl;
trim(str1);
cout<<"串str1:"<<str1<<"长度为:"<<strlen(str1)<<endl;
leftstring(str1,str3,3);
cout<<"串str3:"<<str3<<"长度为:"<<strlen(str3)<<endl;
cout<<"串str2是:"<<str2<<endl;
n=index(str1,str2);
if(n!=-1) cout<<"串str1包含子串str2,从第"<<n<<"字符开始(由0开始计数)。"<<endl;
else cout<<"串str1不包含子串str2"<<endl;
return 0;
}
char* trim(char *s){
int i=0;
while(*(s+i)!='\0') i++;
i--;
while(*(s+i)==' ') *(s+i--)='\0';
return s;
}
char* leftstring(char *s1, char *s2, int n){
int i;
for(i=0;i<n;i++) *s2++=*s1++;
*s2='\0';
return s2;
}
int index(char *s1, char *s2){
bool b=0;
int i,j,n=-1,n1=strlen(s1),n2=strlen(s2);
for(i=0;i<n1;i++){
if(*(s1+i)==*s2){
b=1;
for(j=0;j<n2;j++){
if(*(s1+i+j)!=*(s2+j)){
b=0;
break;
}
}
if(b==1)
}
}
return n;
}
#include<cstring>
using namespace std;
char* trim(char *s);
char* leftstring(char *s1, char *s2, int n);
int index(char *s1, char *s2);
int main(){
char str1[]="I'm student. ",str2[]="student",str3[4];
int n;
cout<<"串str1:"<<str1<<"长度为:"<<strlen(str1)<<endl;
trim(str1);
cout<<"串str1:"<<str1<<"长度为:"<<strlen(str1)<<endl;
leftstring(str1,str3,3);
cout<<"串str3:"<<str3<<"长度为:"<<strlen(str3)<<endl;
cout<<"串str2是:"<<str2<<endl;
n=index(str1,str2);
if(n!=-1) cout<<"串str1包含子串str2,从第"<<n<<"字符开始(由0开始计数)。"<<endl;
else cout<<"串str1不包含子串str2"<<endl;
return 0;
}
char* trim(char *s){
int i=0;
while(*(s+i)!='\0') i++;
i--;
while(*(s+i)==' ') *(s+i--)='\0';
return s;
}
char* leftstring(char *s1, char *s2, int n){
int i;
for(i=0;i<n;i++) *s2++=*s1++;
*s2='\0';
return s2;
}
int index(char *s1, char *s2){
bool b=0;
int i,j,n=-1,n1=strlen(s1),n2=strlen(s2);
for(i=0;i<n1;i++){
if(*(s1+i)==*s2){
b=1;
for(j=0;j<n2;j++){
if(*(s1+i+j)!=*(s2+j)){
b=0;
break;
}
}
if(b==1)
}
}
return n;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<iostream>
#include<vector>
using namespace std;
void indata(vector<int>&);
void outdata(vector<int>);
void main()
{
vector<int> ivec;
ivec.push_back(1);
indata(ivec);
outdata(ivec);
}
void indata(vector<int> &ivec)
{
int num;
cout<<"input data"<<endl;
cin>>num;
while(num!=-1)
{
ivec.push_back(num);
cin>>num;
}
}
void outdata(vector<int>ivec)
{
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
if(iter!=ivec.begin())
{
cout<<*iter+*(iter-1)<<endl;
}
}
}
1. 一个问题就是在输入函数是要使用引用传值(或用指针),不能按值传递参数
2.在输入时使用了迭代器,有可能++iter造成运行异常
#include<vector>
using namespace std;
void indata(vector<int>&);
void outdata(vector<int>);
void main()
{
vector<int> ivec;
ivec.push_back(1);
indata(ivec);
outdata(ivec);
}
void indata(vector<int> &ivec)
{
int num;
cout<<"input data"<<endl;
cin>>num;
while(num!=-1)
{
ivec.push_back(num);
cin>>num;
}
}
void outdata(vector<int>ivec)
{
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
if(iter!=ivec.begin())
{
cout<<*iter+*(iter-1)<<endl;
}
}
}
1. 一个问题就是在输入函数是要使用引用传值(或用指针),不能按值传递参数
2.在输入时使用了迭代器,有可能++iter造成运行异常
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在你的源程序的第99行附近的那几段代码里找一下。。。代码都不贴谁知道错在哪。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询