gpt4 book ai didi

c++ - 在 std::vector C++ 中存储许多元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:03 31 4
gpt4 key购买 nike

对于我的一个应用程序,我需要生成大小为 2^35 的 vector (我的 RAM 大小为 96 GB,因此该 vector 可以轻松放入 RAM)。

int main ()
{
int i;

/* initialize random seed: */
srand (time(NULL));

vector<int> vec;
do {
i = rand() % 10 + 1;
vec.push_back(i);
} while ((vec.size()*sizeof(int))<pow(2,35));

return 0;
}

但是,我注意到我的 do while 循环无限执行。可能的原因之一是 vec.size() 的范围是 long unsigned int,这远远少于插入的元素数量,即 pow(2,35),因此,我认为它进入了无限循环。我可能是错的。如果我错了,请纠正我。但是有人可以告诉我如何在 vec 中插入大于 pow(2,35) 的数字。

海湾合作委员会版本:4.8.2

最佳答案

我将尝试通过一个简单的解决方案来解决您的一些问题:

您遇到的第一个问题是空间。由于您只需要 1-10 之间的数字,因此 int8_t 会更好。

其次是速度。 std::vector 在幕后做了很多分配和重新分配。由于您有固定尺寸,我认为没有必要使用它。知道这一点后,我们将使用一个简单的数组和线程来提高性能。

代码如下:

#include <array>
#include <random>
#include <thread>
#include <cstdint>
#include <memory>
#include <chrono>

// Since you only need numbers from 1-10, a single byte will work nicely.
const uint64_t size = UINT64_C(0x800000000); // Exactly 2^35
typedef std::array<int8_t, size> vec_t;

// start is first element, end is one-past the last. This is a template so we can generate multiple functions.
template<unsigned s>
void fill(vec_t::iterator start, vec_t::iterator end) {
static const int seed = std::chrono::system_clock::now().time_since_epoch().count()*(s+1);
static std::default_random_engine generator(seed);
static std::uniform_int_distribution<int8_t> distribution(1,10);
for(auto it = start; it != end; ++it) {
*it = distribution(generator); // generates number in the range 1..10
}
}

int main() {
auto vec = std::unique_ptr<vec_t>(new vec_t());

// Each will have its own generator and distribution.
std::thread a(fill<0>, vec->begin(), vec->begin() + size/4);
std::thread b(fill<1>, vec->begin() + size/4, vec->begin() + size/2);
std::thread c(fill<2>, vec->begin() + size/2, vec->begin() + (size/4)*3);
std::thread d(fill<3>, vec->begin() + (size/4)*3, vec->end());
a.join();
b.join();
c.join();
d.join();
return 0;
}

关于c++ - 在 std::vector C++ 中存储许多元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29822249/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com