【问题标题】:inserting into vectors c++插入向量 C++
【发布时间】:2015-10-02 00:27:36
【问题描述】:

我需要将向量类型的 66,000 个向量(向量的数量不固定,也可以是 90,000 个向量。为简洁起见,我以 66,000 个向量的示例显示以下代码)到以下向量中:

vector<int> vec;

66,000 个向量中的每一个的大小为 9,000 个元素。我正在使用以下内容来做同样的事情:

vec.reserve(66000*9000);
for(int j=0;j<66000;j++)
    for(int i=0;i<9000;i++) //9000 elements in vec1[i] per vector is not fixed
        vec.push_back(vec1[i]); //i am pushing i as an example

有什么方法可以提高这段代码的效率吗?

我需要连接太多向量,因此相同的解决方案可能与连接两个向量不同。另外我不能使用上一个问题中提到的多线程

【问题讨论】:

  • 如果大小是固定的,为什么不使用数组/std::array呢?
  • @NikolaDimitroff 因为它很大。当然可以动态分配std::array,但这有什么帮助呢?
  • 'i'的双重使用是故意的吗?
  • @FooBar 它可以工作,但我同意,这很难读。
  • @NikolaDimitroff 恐怕大小不固定

标签: c++ c++11 vector


【解决方案1】:

试试下面的

std::vector<int> vec;
vec.reserve( 66000*other_vec.size() );

for ( size_t i = 0; i < 66000; i++ ) 
{
    vec.insert( vec.end(), other_vec.begin(), other_vec.end() );
}

【讨论】:

  • 插入速度比 push_back 快吗?如果是,请问是什么原因
  • @Steg Verner 我认为插入更快,因为至少一般计算只进行一次。
  • @StegVerner 间隔插入已知更快。查看 Scott Meyers “Effective STL”一书。不错的阅读,虽然
【解决方案2】:

您可以使用resize() 代替reserve()。使用 resize() 时删除 push_back。内存分配resize() 并初始化。 reserve 只是分配而不初始化。

【讨论】:

  • 那么他必须删除push_back。我也认为这会带来太小的好处。
  • @PSIAlt “另外我认为这带来的好处太小了。” 不会有很多小的重新分配。
  • @πάνταῥεῖ 什么重新分配?他已经预留了足够的内存。
  • 我看不出这应该有什么帮助。
  • 我必须投反对票,因为使用 resize() 会破坏使用 push_back()
【解决方案3】:

可以直接通过data()去底层数据:

http://en.cppreference.com/w/cpp/container/vector/data

然后你可以直接复制数据(例如只是 memcpy)。

std::vector<int> foo;
for (int i=0; i<10;++i){
    foo.push_back(i);
}

std::vector<int> bar;

bar.resize(10*10);

int pos = 0;
int size = foo.size()*sizeof(int);
for (int i=0; i<10; ++i){
    memcpy(bar.data()+pos/sizeof(int),foo.data(),size);
    pos += size;
}


for (size_t i=0; i<bar.size(); ++i){
    cout << i << " " << bar[i] << endl;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
相关资源
最近更新 更多