如何在 C++ 中将文件中的整数读取到整数数组?例如,该文件的内容:
23
31
41
23
Run Code Online (Sandbox Code Playgroud)
会成为:
int *arr = {23, 31, 41, 23};
Run Code Online (Sandbox Code Playgroud)
?
我实际上有两个问题。首先,我真的不知道如何逐行阅读它们。对于一个整数来说,这非常简单,只需file_handler >> number语法即可完成此操作。我该如何逐行执行此操作?
对我来说似乎更难克服的第二个问题是 - 我应该如何为这个东西分配内存?:你
假设我有一个我要排序的动态数组,我可以做
std::vector<int> v(100);
for (int i = 0; i < 100; i++) v[i] = rand();
std::sort(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)
但对于性能关键代码,初始化开销是不可接受的,更多细节请访问/sf/answers/508836191/
我也可以
int *v = new int[100];
for (int i = 0; i < 100; i++) v[i] = rand();
std::sort(v, v + 100);
Run Code Online (Sandbox Code Playgroud)
但是必须自己管理内存必然会在大型代码库中发生内存泄漏.
所以似乎最可行的方法是
std::unique_ptr<int[]> v(new int[100]);
for (int i = 0; i < 100; i++) v[i] = rand();
std::sort(v, v + 100);
Run Code Online (Sandbox Code Playgroud)
没有初始化开销也不需要担心内存管理,但这会返回一个很长的编译错误.有人能让我知道我做错了什么吗?
我在Ubuntu 14.04,GCC作为编译器.
编辑:更改代码,以便数据尚未排序
我正在寻找一种方法来自动释放一个wchar_ts 数组- 有点像autopointer(我真的没有使用std :: auto_ptr,但我认为它不能用于数组).
我现在的代码是这样的:
/* volume is of type wstring,
* hr is of type HRESULT,
* VSS_PWSZ equals wchar_t*
*/
VSS_PWSZ pwszVolume = new wchar_t[volume.size() + 1];
std::copy(volume.begin(), volume.end(), &pwszVolume);
pwszVolume[volume.size()] = 0;
hr = pDiffMgmt->QueryDiffAreasOnVolume(pwszVolume, &pEnumMgmt);
delete[] pwszVolume;
pwszVolume = NULL;
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么这个愚蠢的功能不能采取const wchar_t*,否则我可以通过volume.c_str().
到目前为止这么好,我认为我的代码解决了这个问题,但现在内存管理变得越来越复杂了:我必须复制delete[]代码来解决可能抛出的异常(我不想在这一点上抓住它) .)
有没有办法pwszVolume在剩下当前范围时自动解除分配?
对于固定阵列,
// will initialize the missing elements to 0 as well
A[max_row][max_col] = {0,}
Run Code Online (Sandbox Code Playgroud)
我们能否在动态数组中实现这一点(特别是多维)?
侧面问题:如果我们不能,并且我们被迫使用嵌套循环,那么上面的技巧的初始化时间与嵌套循环初始化相比如何?
我不想矢量,否则这个问题毫无意义.谢谢你的建议:)
输入是存储在连续存储器中的比特阵列,每1比特存储器具有1比特的比特阵列.
输出是比特阵列的设定位索引的数组.
例:
bitarray: 0000 1111 0101 1010
setA: {4,5,6,7,9,11,12,14}
setB: {2,4,5,7,9,10,11,12}
Run Code Online (Sandbox Code Playgroud)
获得A组或B组都可以.该集存储为uint32_t数组,因此该集的每个元素都是数组中的无符号32位整数.
如何在单个cpu核心上快5倍左右?
当前代码:
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;
template <typename T>
uint32_t bitarray2set(T& v, uint32_t * ptr_set){
uint32_t i;
uint32_t base = 0;
uint32_t * ptr_set_new = ptr_set;
uint32_t size = v.capacity();
for(i = 0; i < size; i++){
find_set_bit(v[i], ptr_set_new, base);
base += 8*sizeof(uint32_t);
}
return (ptr_set_new - ptr_set);
}
inline void find_set_bit(uint32_t n, uint32_t*& ptr_set, uint32_t base){
// Find the set bits …Run Code Online (Sandbox Code Playgroud) memory是1000个元素的向量array []是一个1000个元素的整数数组
for (iteration = 0; iteration < numiterations; iteration++) {
for (j = 1; j < numints; j++) {
memory[j] += memory[j - 1];
//array[j] += array[j - 1];
}
}
Run Code Online (Sandbox Code Playgroud)
如果我跑100次迭代后比较for循环的时间,相比于载体的用于访问所需的时间是非常小
为什么会这样?因为我认为两者都需要不变且几乎相同的时间..
我想用相同的值填充MyStruct数组.如何以最快和最简单的方式完成?我正在运行相当低级的方法,比如memset或memcpy.
编辑:std::fill_n确实符合并且工作正常.但它是C++的方式.如何在纯C中完成?
struct MyStruct
{
int a;
int b;
};
void foo()
{
MyStruct abc;
abc.a = 123;
abc.b = 321;
MyStruct arr[100];
// fill 100 MyStruct's with copy of abc
std::fill_n(arr, 100, abc); // working C++ way
// or maybe loop of memcpy? But is it efficient?
for (int i = 0; i < 100; i++)
memcpy(arr[i],abc,sizeof(MyStruct));
}
Run Code Online (Sandbox Code Playgroud) 本周我开始将我的知识从C升级到C++,我想重载一些运算符
我有一个名为Matrix的课程
#include "lcomatrix.h"
inline Matrix::Matrix(unsigned rows, unsigned cols) :
rows_(rows), cols_(cols)
{
data_ = new double[rows * cols];
}
inline Matrix::~Matrix() {
delete[] data_;
}
inline double& Matrix::operator()(unsigned row, unsigned col) {
return data_[cols_ * row + col];
}
inline double Matrix::operator()(unsigned row, unsigned col) const {
return data_[cols_ * row + col];
}
Run Code Online (Sandbox Code Playgroud)
内容lcomatrix.h是
#include <iostream>
class Matrix {
public:
Matrix(unsigned rows, unsigned cols);
double& operator()(unsigned row, unsigned col);
double operator()(unsigned row, unsigned col) const;
~Matrix(); …Run Code Online (Sandbox Code Playgroud) int * a;
a = new int[10];
cout << sizeof(a)/sizeof(int);
Run Code Online (Sandbox Code Playgroud)
如果我使用普通数组答案是10,唉,打印的幸运数字是1,因为sizeof(int)是4而iszeof(*int)也是4.我怎么能这个?在我看来,保持内存大小是一个复杂的选择.如何使用代码获得大小?
我最好的猜测是迭代一个数组并搜索它的结束,结束是0,对吗?有什么建议?
- 编辑
好吧,我对矢量的担心是它会在推回时重新分配,你得到了重点,我可以分配内存.但是,我无法改变结构,整个代码是相关的.谢谢你的答案,我看到没有办法,所以生病只是寻找一种方法来存储大小的内存.
我问的问题不是什么样的结构.
我有一个关于std :: vector实例化的问题.我比较了std :: vector的实例化和相同大小的数组的动态分配.我期待std :: vector的实例化会花费更长的时间但我的性能差异很大.
对于数组我有53 us对于std :: vector我有4338 us
我的代码:
#include <chrono>
#include <vector>
#include <iostream>
int main() {
unsigned int NbItem = 1000000 ;
std::chrono::time_point<std::chrono::system_clock> start, middle ,end;
start = std::chrono::system_clock::now() ;
float * aMallocArea = (float *)calloc(sizeof(float)*NbItem,0) ;
middle = std::chrono::system_clock::now() ;
std::vector<float> aNewArea ;
middle = std::chrono::system_clock::now() ;
aNewArea.resize(NbItem) ;
//float * aMallocArea2 = new float[NbItem];
end = std::chrono::system_clock::now() ;
std::chrono::duration<double> elapsed_middle = middle-start;
std::chrono::duration<double> elapsed_end = end-middle;
std::cout << "ElapsedTime CPU = " …Run Code Online (Sandbox Code Playgroud)