代码之家  ›  专栏  ›  技术社区  ›  kolistivra

在C++中直接输入向量

  •  3
  • kolistivra  · 技术社区  · 14 年前

    考虑以下代码段:

    ...
    int N,var;
    vector<int> nums;
    cin >> N;
    while (N--)
    {
       cin >> var;
       nums.push_back(var);
    }
    ...
    

    在这种情况下,不使用辅助变量是否可以做到这一点呢? var ?

    5 回复  |  直到 14 年前
        1
  •  11
  •   Diego Sevilla    14 年前

    假设你已经读过首字母 N ,使用 istream_iterator :

    std::vector<int> nums;
    nums.reserve(N);
    std::copy(std::istream_iterator<int>(std::cin), 
              std::istream_iterator<int>(),
              std::back_inserter(nums));
    

    这个 back_inserter 对象将自身转换为迭代器,该迭代器在末尾向向量添加元素。迭代器流可以通过读取的元素类型进行参数化,如果没有给定参数,则表示输入结束。

        2
  •  4
  •   wilhelmtell    14 年前

    如果你还没有 copy_n() 在你的工具带上你应该。非常有用。

    template<class In, class Size, class Out>
    Out copy_n(In first, In last, Size n, Out result)
    {
        while( n-- > 0 && first != last )
            *result++ = *first++;
        return result;
    }
    

    使用此实用程序,可以方便而优雅地将n个元素复制到向量中:

    #include<iterator>
    #include<vector>
    #include<iostream>
    
    // ...
    int n = 0;
    std::cin >> n;
    std::vector<int> v(n);
    copy_n(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
           n,
           v.begin());
    
        3
  •  2
  •   Oliver Charlesworth    14 年前
    vector<int> nums(N);
    for (int i = 0; i < N; i++)
    {
        cin >> nums[i];
    }
    

    一般来说,这实际上更有效。打电话 std::vector::push_back() 没有首字母的重复 reserve 会导致大量的重新分配。

        4
  •  1
  •   Trinetra    14 年前

    来自迭戈-塞维利亚的暗示。 使用范围构造函数

    std::vector<int> nums( std::istream_iterator<int>(std::cin),
                           std::istream_iterator<int>() );
    
        5
  •  0
  •   Steve Townsend    14 年前

    无需分配矢量,然后调整其大小。

    迭代器比索引使用更可取。

    size_t N;
    std::cin >> N;
    
    std::vector<int> values(N);
    for (vector<int>::iterator iter = values.begin(); iter != values.end(); ++iter)
    {
      std::cin >> *iter;
    }