【问题标题】:Creating a new C++ subvector?创建一个新的 C++ 子向量?
【发布时间】:2012-03-31 02:49:17
【问题描述】:

假设我有一个值为 [1,2,3,4,5,6,7,8,9,10] 的向量。我想创建一个新的向量,例如,[5,6,7,8]。我想这只是用指针创建一个向量的问题,还是我必须 push_back 所有我需要的中间值?

【问题讨论】:

  • 到目前为止给出的答案都是不错的选择。虽然您可以创建一个指向子范围的指针向量,但您可能不想这样做。如果原始向量增长到必须重新分配其内部存储的地步,那么您的指针将全部变为无效。尤其是在处理如此小的范围时,最好使用副本。
  • 定义“指代”。如果原始向量发生变化会怎样?

标签: c++ vector


【解决方案1】:

你不用push_back,如果你不想用,​​你可以用std::copy

std::vector<int> subvector;
copy ( v1.begin() + 4, v1.begin() + 8, std::back_inserter(subvector) );

【讨论】:

  • 你不应该在复制之前将子向量初始化为正确的大小吗?
  • @obmarg,或者你可以使用某种形式的insert_iterator
  • @obmarg 是或使用反向插入迭代器 - std::back_inserter 将为您制作一个
  • @Kristo(和@awoodland)是的。虽然根据我的经验他们往往很慢,但他们不只是在幕后使用 push_back 吗?
  • 因为已经 30 分钟了,@Luchian 还没有注意到我们的 cmets,所以我继续编辑代码。
【解决方案2】:

使用std::valarray 而不是向量很容易做到这一点:

#include <valarray>
#include <iostream>
#include <iterator>
#include <algorithm>

int main() {
  const std::valarray<int> arr={0,1,2,3,4,5,6,7,8,9,10};

  const std::valarray<int>& slice = arr[std::slice(5, // start pos
                                                   4, // size
                                                   1  // stride
                                                  )];

}

它需要 valarray 的“切片”,比向量更通用。

对于向量,您可以使用带有两个迭代器的构造函数来完成:

const std::vector<int> arr={0,1,2,3,4,5,6,7,8,9,10};
std::vector<int> slice(arr.begin()+5, arr.begin()+9);

【讨论】:

    【解决方案3】:

    我会做以下事情:

    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    void printvec(vector<int>& v){
            for(int i = 0;i < v.size();i++){
                    cout << v[i] << " ";
            }
            cout << endl;
    }
    
    int main(){
            vector<int> v;
    
            for(int i = 1;i <= 10;i++) v.push_back(i);
            printvec(v);
    
            vector<int> v2(v.begin()+4, v.end()-2);
            printvec(v2);
            return 0;
    }
    

    ~

    【讨论】:

      【解决方案4】:

      std::vector 的一个构造函数接受一个范围:

      std::vector<int> v;
      
      // Populate v.
      for (int i = 1; i <= 10; i++) v.push_back(i);   
      
      // Construct v1 from subrange in v.
      std::vector<int> v1(v.begin() + 4, v.end() - 2);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-05
        • 2012-03-13
        • 2022-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多