精华内容
下载资源
问答
  • C++输入未知长度数组

    万次阅读 多人点赞 2019-06-23 18:33:07
    假如要输入一组数字进行排序,但是不知道有多少个数字 静态数组int array[10],它的长度必须是个常数才可以定义。如果知道数组长度n,可以先cin>>n;然后用动态数组int* array = new int[n]。但是如果不知道...

    注意:该作者博客已迁移至https://buxianshan.xyz

    假如要输入一组数字进行排序,但是不知道有多少个数字

    静态数组int array[10],它的长度必须是个常数才可以定义。如果知道数组长度n,可以先cin>>n;然后用动态数组int* array = new int[n]。但是如果不知道数组长度,该怎么定义呢?

    经过查找资料,终于找到了一种解决方法。使用STL中的vector。

    STL

    STL是Standard Template Library的简称,中文名标准模板库。根本上说,STL是一些“容器”的集合,这些“容器”有 list, vector, set, map 等。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL是C++的一部分,因此不用安装额外的库文件。
    在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。

    vector

    vector(向量):是一种顺序容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而vector正好弥补了这个缺陷,它的特征是相当于可分配拓展的数组,它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。

    简单用法:
    定义一个vector,元素为 int 型的容器array,可以简单理解为一个整型数组。

    vector<int> array;
    

    在它末尾添加一个数字

    array.push_back(number);
    

    返回数组长度

    array.size();
    

    所以输入未知长度的数组可以这样写:

    #include<iostream>
    #include<vector>//引入vector头文件
    using namespace std;
    int main() {
     vector<int> array;//定义一个vector数组array
     int number;
     while (1) {
      cin >> number;
      array.push_back(number);//每输入一个数字就把它添加到数组的最后
      if (cin.get() == '\n')//如果是回车符则跳出循环
       break;
     }
     int len = array.size();//返回数组长度为len
     //下面遍历一遍数组看看对不对
     for (int i = 0; i < len; i++) {
      cout << array[i] << endl;
     }
     return 0;
    }
    

    测试截图:
    在这里插入图片描述

    已经完成了输入和保存数组

    STL的<algorithm>库中也提供了很多排序算法,遍历vector也可以使用迭代器。总之STL集成了很多优秀的算法,熟悉使用可以提高开发效率。还有很多需要学习的东西。

    参考

    • https://www.cnblogs.com/SarahZhang0104/p/5749680.html
    • https://blog.csdn.net/lizhentao0707/article/details/82224807
    • https://www.cnblogs.com/aiguona/p/7228364.html
    • https://baike.baidu.com/item/STL/70103?fr=aladdin
    展开全文
  • #include <iostream> #include <vector> using namespace std; int main() { int sum=0,value=0; vector<int>test; //实际上非数字就会结束循环 cout<<"以*号作为结束;...
    #include <iostream>
    #include <vector>
    using namespace std;
     
    int main()
    {
        int sum=0,value=0;
        vector<int>test;
        //实际上非数字就会结束循环
        cout<<"以*号作为结束;";
        while(cin>>value)
            test.push_back(value);
        vector<int>::iterator it;
        for (it=test.begin();it!=test.end();it++)
            cout<<*it<<endl;
        return 0;
    }
    
    展开全文
  • C++输入获取未知长度的行输入数组 与 输出控制

    头文件 #include <iostream>

    程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入


    cin的三种方式

    cin >> n;                       //Enter、Space、Tab作为结束条件(会将其丢出缓冲区)
    ch = cin.get() | cin.get(ch)    //Enter作为结束符(不丢弃缓冲区中的Enter,即下次输入的是enter)
    cin.getline(数组名,长度,结束符) 大体与 cin.get(数组名,长度,结束符)类似。

    cin.get()当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。


    变长输入

    当输入数据的长度不固定时,即以输入结束符结束时:

    abcd...balabla+enter
    Ctrl + Z
    enter

    此时要获取缓冲区中的字符或者数组可以通过以下方式:

    char ch;
    ch = cin.get();

    示例:

    #include <iostream>
    #include<algorithm>
    #include <vector>
    using namespace std;
    void getin(vector<int> &vec){
        int val = 0;
        char ch;
        bool flag = 0, minus = 0;       //flag用来标注最后一个val是否输入到vec中,minus判断是否为负
        while(ch = cin.get()){
            if(ch == '\n')              //如果是换行符,结束
                break;
            if(ch == ' '){              //如果是空格,将空格前的数插入到vec中,开始记录新的数
                vec.push_back(val);
                val = 0;
                flag = 1;
                minus = false;
                continue;
            }
            if(ch == '-'){
                minus = true;
                continue;
            }
            flag = 0;
            if(minus == true){
                val = val*10-(ch-'0');
    
            }else{
                val = val*10+ch-'0';
            }
    
        }
        if(flag == 0)
            vec.push_back(val);
    }
    
    int main(){
        vector<int> vec;
    
        getin(vec);
        for(int i = 0; i < vec.size(); i++){
            cout << vec[i] << " ";
        }
        cout << endl;
        return 0;
    }

    在输入流与输出流中使用控制符

    需要注意的是: 如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。

    举例: 输出双精度数。

    double a=123.456789012345;                                      //对a赋初值
    (1) cout<<a;                                                    //输出: 123.456
    (2) cout<<setprecision(9)<<a;                                   //输出: 123.456789
    (3) cout<<setprecision(6);                                      //恢复默认格式(精度为6)
    (4) cout<< setiosflags(ios∷fixed);                              //输出: 123.456789
    (5) cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;           //输出: 123.45678901
    (6) cout<<setiosflags(ios∷scientific)<<a;                       //输出: 1.234568e+02
    (7) cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a;      //输出: 1.2346e02

    下面是整数输出的例子:

    int b=123456;                               //对b赋初值
    (1) cout<<b;                                //输出: 123456
    (2) cout<<hex<<b;                           //输出: 1e240
    (3) cout<<setiosflags(ios∷uppercase)<<b;    //输出: 1E240
    (4) cout<<setw(10)<<b<<','<<b;              //输出:  123456,123456
    (5) cout<<setfill('*')<<setw(10)<<b         //输出: **** 123456
    (6) cout<<setiosflags(ios∷showpos)<<b;      //输出: +123456

    如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。

    例3.1 各行小数点对齐。

    #include <iostream>
    #include <iomanip>
    using namespace std;
    int main( )
    {
       double a=123.456,b=3.14159,c=-3214.67;
       cout<<setiosflags(ios∷fixed)<<setiosflags(ios∷right)<<setprecision(2);
       cout<<setw(10)<<a<<endl;
       cout<<setw(10)<<b<<endl;
       cout<<setw(10)<<c<<endl;
       return 0;
    }

    输出如下:
    123.46 (字段宽度为10,右对齐,取两位小数)
    3.14
    -3214.67
    先统一设置定点形式输出、取两位小数、右对齐。这些设置对其后的输出均有效(除非重新设置),而setw只对其后一个输出项有效,因此必须在输出a,b,c之前都要写setw(10)。


    展开全文
  • c++ 输入不定长的字符数组

    千次阅读 2020-04-19 14:54:14
    OJ题目中总会出现给定一个字符串,删除其中某些字符的题目,但输入不会给字符串的长度。 网上有的方法是先定义一个超大的数组,然后用这个大数组来储存数据,但我不喜欢这个方法,不但浪费空间,如果题目给定字符串...

    OJ题目中总会出现给定一个字符串,删除其中某些字符的题目,但输入不会给字符串的长度。

    网上有的方法是先定义一个超大的数组,然后用这个大数组来储存数据,但我不喜欢这个方法,不但浪费空间,如果题目给定字符串大于这个大数组,还会报错

    当然,也有用vector的,但是vector毕竟不是自己写实现的,用起来总有一点心虚

    我一般用的方法是string 转 char数组,话不多说,上代码

    class ArrayTest
    {
    private:
    	char *a;
    	int n;
    public:
    	ArrayTest(void);
    	~ArrayTest(void);
    	void intArray(std::string s);
    	std::string getString();
    	//void removeSame(char x);
    	void output();
    };
    
    void ArrayTest::intArray(std::string s)
    {
    	n=s.length();
    	a=new char[n];
    	for(int i=0;i<n;i++) a[i]=s[i];
    }
    

    关于string的输入,我用的是getline,这样空格也能输入

    std::string ArrayTest::getString()
    {
    	std::string str;
    	getline(std::cin,str);
    	return str;
    }
    

    这个方法好处在于,使用的空间不大,给出的字符串多长,就使用多少空间,同时,空格也能输入进去。

    展开全文
  • C++输入未知长度字符串存入数组

    千次阅读 2020-06-04 15:37:45
    记录C++学习过程的问题,方便以后自己查看 int main() { string str; char temp; while((temp=cin.get())!='\n') { str +=temp; } const int LEN =str.length(); char* dest = new char[LEN]; for(int i = 0;i<...
  • C++读取一串未知长度数组并保存

    千次阅读 2019-09-09 21:11:44
    例如做题时输入一串数组,以空格隔开,但是不知道数组长度,就可以用下面这段代码来读取,最后保存进 vector 里面。 #include<iostream> #include<vector> using namaspce std; int main() { char c...
  • http://vivi.dyndns.org/tech/cpp/vector.html 长度未知 时使用vector
  • C++本身不支持未知大小的动态数组,通常有如下方法解决: 1、动态申请内存 int * p, i; cout 请输入数组大小"; cin >> i; p = new int[i]; delete []p; 2、使用vector类
  • 就直接上代码了: #include<iostream> #include<algorithm> using namespace std; vector<int> arrays; int i; cin >> i; arrays.push_back(i); while(cin.get() !... ...
  • 另外,关于将未知长度的字符串输入数组,还有什么好办法吗? ``` int main() { int time; scanf("%d", &time); int count=0; while(count ) { string str; char temp; int i; while((temp=cin.get())!=...
  • 如何输入未确定长度数组 今天用许久未碰的C语言写数据结构作业时遇到了这个问题,在不确定要输入的整型数组长度时我们应该如何输入,并用回车结束输入?如:LA=(3,5,8,11),LB=(2,6,8,9,11,15,20) 在这给出两...
  • #include<iostream> #include<iomanip> using namespace std; int main() { int a[20],i; for(i=0;;i++){ cin>>a[i]; if(getchar()=='\n') //遇回车结束 break; ...
  • 一般题目要输入一个长度为n的数组(n需要输入),因为其长度未知,我们常规方法是建立一个足够长的数组,如a[100],a[10000000]等。 这样处理的缺点是会消耗大量不必要的内存。 因此我们有必要引入动态分配内存的介绍...
  • 使用C++模板获取数组长度

    千次阅读 2019-02-28 22:06:49
    利用模板的特性,在编译期就获取到数组长度. 模板函数GetArrayLength template &lt;typename T, size_t N&gt; inline size_t GetArrayLength(const T(&amp;)[N]) { return N; } 示例 int array[] ...
  • 比较已输入字符数和已开辟数组大小, 若大小不够, 则开辟一个更大的数组,将老的数据拷贝到新的数组,释放老的数组, 同时将老的指针指向新的数组。 上面有一点主意的是输入格式: cin.get(temp) , 这中输入格式...
  • C++定义未知元素个数的数组

    万次阅读 2018-03-20 21:44:21
    1、使用动态内存分配方法c++申请动态内存:int arraySize; //定义元素个数cin&gt;&gt;arraySize; //输入元素个数int *p; //指针指向一个数组p = new int[arraySize]; //动态分配内存...delete []p; //最后...
  • C++使用变量作为数组长度

    千次阅读 2017-11-05 22:50:19
    C++中一般是不能使用变量作为一个数组长度的,必须使用常量。  这是因为数组作为C++的内置数据类型,其空间分配在栈内存中,这部分空间的大小在编译时就要确定,不能等到运行时再分配。常量的值在编译时就能得到...
  • # include # include # include using namespace std ; int main ( ) { vector < string > ...每次输入字符串敲一下回车,继续输入下一个字符串,输入完毕后,ctrl+z,结束。
  • 将一维数组视作环形,即数组最后一项的下一项是数组首项。 将队列中的元素按照顺序存入环形数组中,则只需记录队首和队尾的下标即可确定整个队列在数组中的位置。 在该循环数组中,队尾插入(数组未满时)和队首删除...
  • C++练习3:数组逆序

    2021-04-05 16:42:27
    数据结构 数组名[数组长度] = { 值1,值2,…}; 数据结构 数组名[] = {值1,值2,…}; (2)二维数组的定义方式: 数据结构 数组名[行数][列数]; 数据结构 数组名[行数][列数] = {{数据1 ,数据2},{数据3,数据4...
  • C++输入数组并进行操作问题C++按从大到小的顺序输入若干个整数,可以有重复,打印输出其中第一大和第二大的数(按从大到小的顺序,把所有重复的数都打印出来)。 C++按从大到小的顺序输入若干个整数,可以有重复,...
  • C++泛型之求未知数组长度

    千次阅读 2016-04-09 19:09:19
    C++泛型之求未知数组长度 一般情况下,已知数组类型,我们求数组长度的方法一般是: double A[] = {0,1,2,3,4}; cout 当然也可以这样: double A[] = {0,1,2,3,4}; cout 因此,求未知数组长度的方法也很...
  • C/C++定义二维数组(矩阵)

    万次阅读 多人点赞 2016-09-30 09:24:20
    本文介绍了C/C++二维数组定义,分维度确定与否来介绍。
  • C++ 求string类数组长度(元素个数)

    万次阅读 2018-03-11 00:13:24
    sizeof(数组名) / sizeof(数组名[0])整个数组长度/第一个元素的长度(长度是固定的)sizeof其作用是返回一个对象或类型所占的内存字节数,在windows下string是28例子string A[] = { "Hello "};sizeof(A)的...
  • 项目中遇到C#调用C++算法库的情况,C++内部运算结果返回矩形坐标数组(事先长度未知且不可预计),下面方法适用于访问C++内部分配的任何结构体类型数组。当时想当然的用ref array[]传递参数,能计算能分配,但是在C#...
  • 循环遍历不确定长度数组

    千次阅读 2017-05-04 18:07:27
    在做项目的时候,更新界面,我们可以在请求成功的时候把选中的实体移除,如果父类就有...在遍历不确定的长度数组时,我们选中用迭代器Iterator<CustomAfterAcceptNumberBean> it = acceptNumberData.iterator(); wh

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,755
精华内容 5,502
关键字:

c++输入未知长度的数组

c++ 订阅