C++指针操作vector出错

JPF1024 2014-03-14 06:03:40
想移动指针访问vector的下一个元素,总是出错...
求解.

void inputZMuL()
{
cout << "请输入字母:" << endl;
vector<string> pa;
vector<string> pasd; //存放出现次数的字母.
vector<int> pasdnumber ; //存放出现次数
string inpa ; //暂存字母.
while(getline(cin,inpa))
{
pa.push_back(inpa);
}
/*
正确代码.风险高.
for(unsigned i=0;i!=pa.size();++i)
{
cout << pa[pa.size()-(i+1)] << endl;
}*/
for(vector<string>::iterator first=pa.begin();first!=pa.end();first+=1)
{

cout << (*first)++ << endl;//移动指针到下一个位置并输出.出错
}
}
...全文
321 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶之香 2014-03-17
  • 打赏
  • 举报
回复
引用 18 楼 dcxy0 的回复:
[quote=引用 12 楼 lovesmiles 的回复:] [quote=引用 11 楼 xiejianjun417 的回复:] 对于C++的STL库,不推荐使用 因为如果出了问题,程序的bug不好找
水平不够确实不要用,但stl本身是个好东西[/quote] 问题是初学者,没有别的库可学了。。。。。。[/quote] 你可以自己实现呀,学数据结构不就是为了这些么?
JPF1024 2014-03-15
  • 打赏
  • 举报
回复
引用 8 楼 jerry_dqh 的回复:
[quote=引用 6 楼 dcxy0 的回复:] [quote=引用 2 楼 jerry_dqh 的回复:] cout << (*first)++ 你这样是对vector中的一个元素值++.。
我是想移动指针到下一个元素,然后输出。。。[/quote] first+=1,已经在for循环里加了,你这里直接cout << *first <<endl;就行了。 不要再++,否则会有问题。 [/quote] 这个题的要求是,输入很多string,判断哪个string连续出现的次数最多,并输出string和次数 比如: now now now kis kis kis kis dsf fsd 就输出kis,出现了四次,求代码,谢谢 弄了很久还是不行 主要是:记录字母和记录字母次数的出错

 cout << "请输入字母:" << endl;
    vector<string> pa;
    string inpa ; //暂存字母.
    while(getline(cin,inpa))
    {
     pa.push_back(inpa);
    }
    const unsigned ARRAY_COUNT = pa.size();
    string  pasd[ARRAY_COUNT];//记录出现字母
    int  pasdnumber[ARRAY_COUNT];//记录出现的次数.
    //cout << pa.size() << endl;
    unsigned pasdsize = 0 ;
    for(unsigned i=0;i!=pa.size();++i)
    {
            for(auto &k:pasd)//判断字母数组的长度.
            {
                if(&k!=NULL)//非空数组
                {
                    pasdsize+=1;
                }
            }
        //cout << i  << pa.size() << endl;
        if(i<(pa.size()-1))
        {

        //cout << pa[i] << pa[i+1] << endl;
        if(pasdsize==0)//里面为空,无数据.
        {
            if(pa[i]==pa[i+1])//里面无数据,可以直接添加.
            {
                pasd[i]=pa[i];//将当前字母,添加到重复字母区.
                pasdnumber[i]=2;//将当前字母出现的次数添加到重复字母计数区.
            }
        }else//当数组不为空.
            {
                if(pa[i]==pasd[i])//如果已经有相同的字母.
                {
                    pasdnumber[i]+=1;
                }else//如果没有相同的字母.
                {
                    pasd[i+1]=pa[i];
                    pasdnumber[i]=2;
                }

            }
        }
        //cout << pa[pa.size()-(i+1)] << endl;
    }
    unsigned pasdsizeks = 0 ;
    for(auto &k:pasd)//判断字母数组的长度.
    {
        if(&k!=NULL)//非空数组
        {
            pasdsizeks+=1;
        }
    }
    cout << pasdsize << 1111 << pasdsizeks << endl;
    cout << "字母和次数分别是:" << endl;

    for(unsigned is=0;is<=pasdsizeks;++is)
    {
        cout << pasd[is] << endl;//输出报错
        cout << pasdnumber[is] << endl;//输出报错
    }


    //***********************

    /*
    for(vector<string>::iterator first=pa.begin();first!=pa.end();first+=1)
    {

        cout <<  (*first)++ << endl;//移动指针到下一个位置并输出.
    }*/

mujiok2003 2014-03-15
  • 打赏
  • 举报
回复
使用std::copy就好了
仙境之桥2046 2014-03-15
  • 打赏
  • 举报
回复
五楼各种正解...两次++,逻辑. string未实现++重载
碼上道 2014-03-15
  • 打赏
  • 举报
回复
现在是你程序的逻辑问题,不是vector的问题
勤奋的小游侠 2014-03-15
  • 打赏
  • 举报
回复
引用 11 楼 xiejianjun417 的回复:
对于C++的STL库,不推荐使用 因为如果出了问题,程序的bug不好找
水平不够确实不要用,但stl本身是个好东西
JPF1024 2014-03-15
  • 打赏
  • 举报
回复
引用 12 楼 lovesmiles 的回复:
[quote=引用 11 楼 xiejianjun417 的回复:] 对于C++的STL库,不推荐使用 因为如果出了问题,程序的bug不好找
水平不够确实不要用,但stl本身是个好东西[/quote] 问题是初学者,没有别的库可学了。。。。。。
JPF1024 2014-03-15
  • 打赏
  • 举报
回复
引用 16 楼 cocodada 的回复:
根据要求写了一个代码,满足基本要求,,,
#include<iostream>
#include<vector>
#include<string>
using namespace std;

int main()
{
	vector<string> str, repstr;
	vector<int> num;
	int n = 0, max = 0;
	string st;

	while(getline(cin,st))
	{
		str.push_back(st);
	}

	if(str.empty()) return 0;

	vector<string>::iterator iter = str.begin();
	repstr.push_back(*iter);
	num.push_back(n);
	vector<string>::iterator repiter = repstr.begin(), maxiter  = repstr.begin();
	vector<int>::iterator numiter = num.begin();

	for(iter; iter != str.end(); ++iter)
	{
		if((*iter).empty()) {}
		else 
		{
			for( repiter = repstr.begin(),numiter = num.begin(); repiter != repstr.end(); ++repiter, ++numiter)
			{
				if(*repiter == *iter)
				{
					++(*numiter);
				if(max < *numiter) 
				{
					max = *numiter;
					maxiter = repiter;
				}
				}

			}
			if(repiter == repstr.end())
			{
				repstr.push_back(*iter);
				num.push_back(1);
			}
		}
	}

	cout<<*maxiter<<":"<<max<<endl;

	return 0;
}
谢谢,终于解决了。。。。。。
Ashily_1020 2014-03-15
  • 打赏
  • 举报
回复
根据要求写了一个代码,满足基本要求,,,
#include<iostream>
#include<vector>
#include<string>
using namespace std;

int main()
{
	vector<string> str, repstr;
	vector<int> num;
	int n = 0, max = 0;
	string st;

	while(getline(cin,st))
	{
		str.push_back(st);
	}

	if(str.empty()) return 0;

	vector<string>::iterator iter = str.begin();
	repstr.push_back(*iter);
	num.push_back(n);
	vector<string>::iterator repiter = repstr.begin(), maxiter  = repstr.begin();
	vector<int>::iterator numiter = num.begin();

	for(iter; iter != str.end(); ++iter)
	{
		if((*iter).empty()) {}
		else 
		{
			for( repiter = repstr.begin(),numiter = num.begin(); repiter != repstr.end(); ++repiter, ++numiter)
			{
				if(*repiter == *iter)
				{
					++(*numiter);
				if(max < *numiter) 
				{
					max = *numiter;
					maxiter = repiter;
				}
				}

			}
			if(repiter == repstr.end())
			{
				repstr.push_back(*iter);
				num.push_back(1);
			}
		}
	}

	cout<<*maxiter<<":"<<max<<endl;

	return 0;
}
叶之香 2014-03-15
  • 打赏
  • 举报
回复
对于C++的STL库,不推荐使用 因为如果出了问题,程序的bug不好找
JPF1024 2014-03-14
  • 打赏
  • 举报
回复
引用 8 楼 jerry_dqh 的回复:
[quote=引用 6 楼 dcxy0 的回复:] [quote=引用 2 楼 jerry_dqh 的回复:] cout << (*first)++ 你这样是对vector中的一个元素值++.。
我是想移动指针到下一个元素,然后输出。。。[/quote] first+=1,已经在for循环里加了,你这里直接cout << *first <<endl;就行了。 不要再++,否则会有问题。 [/quote] 没有效果,我换数组去做了,谢谢。
碼上道 2014-03-14
  • 打赏
  • 举报
回复
引用 6 楼 dcxy0 的回复:
[quote=引用 2 楼 jerry_dqh 的回复:] cout << (*first)++ 你这样是对vector中的一个元素值++.。
我是想移动指针到下一个元素,然后输出。。。[/quote] first+=1,已经在for循环里加了,你这里直接cout << *first <<endl;就行了。 不要再++,否则会有问题。
JPF1024 2014-03-14
  • 打赏
  • 举报
回复
引用 1 楼 AfterSeptember 的回复:
你要输出也应该是*first++这样输出吧。
这样也是错的。。。不是我想要的那种。。。。。。
JPF1024 2014-03-14
  • 打赏
  • 举报
回复
引用 2 楼 jerry_dqh 的回复:
cout << (*first)++ 你这样是对vector中的一个元素值++.。
我是想移动指针到下一个元素,然后输出。。。
JPF1024 2014-03-14
  • 打赏
  • 举报
回复
引用 3 楼 u013432522 的回复:
不知道你为什么要这么做(逻辑上), 但从语法上你的代码是有问题的: begin 的类型是 vector<string>::iterator, *begin 的类型是string, 然后string没有重载operator ++,所以编译当然过不了了.
原来是这样,这是一个读入很多string,然后判断出现次数最多的单词,我是测试一下,可不可以输出下一个单词、、
zideqiler 2014-03-14
  • 打赏
  • 举报
回复
不知道你为什么要这么做(逻辑上), 但从语法上你的代码是有问题的: first 的类型是 vector<string>::iterator, *first 的类型是string, 然后string没有重载operator ++,所以编译当然过不了.
zideqiler 2014-03-14
  • 打赏
  • 举报
回复
不知道你为什么要这么做(逻辑上), 但从语法上你的代码是有问题的: begin 的类型是 vector<string>::iterator, *begin 的类型是string, 然后string没有重载operator ++,所以编译当然过不了了.
碼上道 2014-03-14
  • 打赏
  • 举报
回复
cout << (*first)++ 你这样是对vector中的一个元素值++.。
未注销 2014-03-14
  • 打赏
  • 举报
回复
你要输出也应该是*first++这样输出吧。

65,170

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧