注册 登录
编程论坛 C++教室

关于向量的问题,新手求教

moox 发布于 2017-12-27 20:20, 2679 次点击
程序代码:
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>> threeSum(vector<int> &num)
{
    vector<vector<int>> result;
    int len=num.size();
    for(int i=0;i<len;++i)
    {
        int target=0-num[i];
        int start=i+1,end=len-1;
        while(start<end)
        {
            if(num[start]+num[end]==target){
                result.push_back(num[i]);
                result.push_back(num[start]);
                result.push_back(num[end]);
                start++;end--;
                while(start<end&&num[start]==num[start-1])
                {
                    start++;
                }
                while((start<end) && (num[end]==start[end+1]))
                {
                    end--;
                }
            }
            else if(num[start]+num[end]<target) start++;
            else end--;
        }
        while(i<len) if(num[i]==num[i+1]) i++;
    }
    return result;
}

void main(){
    int a[]={-5,-1,0,1,2,3,4};
    vector<int> num(a);
    vector<vector<int>> b=threeSum(num);
    for(int i=0;i<b.size();i++)
       cout<<b[i]<<endl;
}

E:\练习题\三数之和为零\threeSum.cpp(4) : error C2275: 'vector<int,class std::allocator<int> >' : illegal use of this type as an expression
求三个数之和为零的算法,不知道哪里错了用向量老是实现不了,书也反了,还是不知道问题在哪。
求大佬有空看看指点下我。
另外,可以的话,推荐几个学习网址,看书还是有很多不懂得。

[此贴子已经被作者于2017-12-27 20:24编辑过]

11 回复
#2
rjsp2017-12-27 23:22
代码没什么正确的地方,但这个错误提示更奇怪,你用的是什么编译器?
#3
stop12042017-12-28 09:04
最大错误  
vector<vector<int>>
>> 是什么符号?
vector< vector<int> >

--------------------------------------
result.push_back(num[i]);
    你的result的元素是什么类型?  vector<int>
num[i]返回什么类型?
    int
#4
stop12042017-12-28 09:12
int start=i+1,end=len-1;

start[end+1] ?  看出问题了吗
__________________________________

    vector<int> num(a);
这种初始化的要求是什么?
     具有相同的容器类型,并存放相同类型的元素

你只能通过循环去给双方赋值,如果是string型 可以直接用迭代器初始化 num(a.begin(),a.end())

__________________________________
vector<vector<int>> b=threeSum(num);
    for(int i=0;i<b.size();i++)
       cout<<b[i]<<endl;

b[i]返回什么类型?   
    vector<int>  
vector<int>有定义 operator<< 操作符吗? 或许你可以自己重载一个



#5
rjsp2017-12-28 09:43
回复 3楼 stop1204
在古代,vector<vector<int>> 中两个尖括号之间必须加空格,以避免被分析成操作符“>>”
但现在,C++标准要求编译器必须能正确处理这种情况。
所以我才问他用的是什么编译器
#6
stop12042017-12-28 12:12
回复 5楼 rjsp
  这个到没注意到. 11版 里面加的吗
#7
rjsp2017-12-28 13:06
回复 6楼 stop1204
是C++11明确下来的,但在此之前各大编译器就已经都支持了。
#8
moox2017-12-28 14:03
回复 3楼 stop1204
result.push_back(5);书上说这个是在result向量最后插入一个元素5,
result.push_back(num[i]);不能这样写吗?
#9
moox2017-12-28 14:15
回复 4楼 stop1204
我看书上说输出向量中所有元素有两种形式一种是用遍历器,还有一种是
for(int i=0;i<a.size();i++)
 cout<<a[i]<<" ";
#10
moox2017-12-28 15:33
回复 2楼 rjsp
我用vc++6.0,书上没有空我就没空了。。。。
E:\练习题\三数之和为零\threeSum.cpp(16) : error C2664: 'push_back' : cannot convert parameter 1 from 'int' to 'const class std::vector<int,class std::allocator<int> > &'
        Reason: cannot convert from 'int' to 'const class std::vector<int,class std::allocator<int> >'
        No constructor could take the source type, or constructor overload resolution was ambiguous
E:\练习题\三数之和为零\threeSum.cpp(17) : error C2664: 'push_back' : cannot convert parameter 1 from 'int' to 'const class std::vector<int,class std::allocator<int> > &'
        Reason: cannot convert from 'int' to 'const class std::vector<int,class std::allocator<int> >'
        No constructor could take the source type, or constructor overload resolution was ambiguous
那个向量可以理解为是一个类中有数组和捆绑一些成员函数吗?上面那个错误为什么不能在result后面加入a[i]的值?
#11
moox2017-12-28 17:09
回复 5楼 rjsp
vector<vector<int> >是指二维数组对吧,我不明白为什么要用到二维数组...
我把二维数组换成一维的就不会提示有错了.但还是出不了结果...
程序代码:
#include<iostream>
#include<vector>
using namespace std;
vector<int> threeSum(vector<int> &num)
{
    vector<int> result;
    int len=num.size();
    for(int i=0;i<len;++i)
    {
        int target=0-num[i];
        int start=i+1,end=len-1;
        while(start<end)
        {
            if(num[start]+num[end]==target)
            {
                result.push_back(num[i]);
                result.push_back(num[start]);
                result.push_back(num[end]);
                start++;end--;
                while(start<end&&num[start]==num[start-1])
                {
                    start++;
                }
                while((start<end) && (num[end]==num[end+1]))
                {
                    end--;
                }
            }
            else if(num[start]+num[end]<target) start++;
            else end--;
        }
        while(i<len) if(num[i]==num[i+1]) i++;
    }
    for(vector<int>::iterator it=result.begin ();it!=result.end ();it++)
        cout<<it<<' ';
    cout<<endl;
    return result;
}

void main(){
    int a[8]={-9,-3,-1,0,1,2,3,4};
    vector<int> num(a,a+8);
    vector<int> b(threeSum(num));
    for(vector<int>::iterator it=b.begin();it!=b.end();++it)
        cout<<*it<<" ";
    cout<<endl;
}
#12
moox2017-12-28 18:26
谢谢各位大佬,问题解决了,虽然程序很丑,但学到了,不少东西.
程序代码:
#include<iostream>
#include<vector>
using namespace std;
vector<int> threeSum(vector<int> &num)
{
    vector<int> result;
    int len=num.size();
    for(int i=0;i<len;++i)
    {
        int target=0-num[i];
        int start=i+1,end=len-1;
        while(start<end)
        {
            if(num[start]+num[end]==target)
            {
                result.push_back(num[i]);
                result.push_back(num[start]);
                result.push_back(num[end]);
                start++;end--;
                while(start<end&&num[start]==num[start-1])
                {
                    start++;
                }
                while((start<end) && (num[end]==num[end+1]))
                {
                    end--;
                }
            }
            else if(num[start]+num[end]<target) start++;
            else end--;
        }
        if(num[i]==num[i+1]) while(i<len&&num[i]==num[i+1]) i++;
    }
    return result;
}

void main(){
    int a[8]={-9,-3,-1,0,1,2,3,4};
    vector<int> num(a,a+8);
    vector<int> b(threeSum(num));
    for(vector<int>::iterator it=b.begin();it!=b.end();++it)
        cout<<*it<<" ";
    cout<<endl;
}

1