我有一个类,我希望有一个静态成员,它是一个结构.
例如:.h文件:
typedef struct _TransactionLog
{
string Reference;
vector<int> CreditLog;
int id;
}TransactionLog;
class CTransactionLog {
static TransactionLog logInfo;
public:
static void Clear();
static TransactionLog getLog();
};
Run Code Online (Sandbox Code Playgroud)
.cpp文件:
void CTransactionLog::Clear()
{
logInfo.Reference = "";
logInfo.CreditLog.clear();
logInfo.id = 0;
}
TransactionLog CTransactionLog::getLog()
{
return logInfo;
}
Run Code Online (Sandbox Code Playgroud)
我明白了
描述资源路径位置类型
未定义的对"CTransactionLog :: logInfo"TransactionLog.cpp的引用
有人可以举个例子来说明如何使这项工作成功吗?拥有一个静态成员是一个struct(带有stl成员),使用静态成员方法对其进行操作,并在代码的其他几个部分中包含此头.这应该用于通过应用程序添加日志记录.
我一直在用C++编写DLL,现在我必须从VB6应用程序调用这个DLL.
这是来自此DLL的代码示例:
#include <vector>
#include <string>
using namespace std;
void __stdcall DLLFunction (vector<Object>*)
{
// performs a few operations on the Objects contained in the vector.
}
struct Object
{
long CoordX;
long CoordY;
long Width;
long Height;
LPSTR Id;
};
Run Code Online (Sandbox Code Playgroud)
我还在VB6中定义了"Object struct"
Private Type Object
CoordX As Integer
CoordY As Integer
Width As Integer
Height As Integer
Id As String
End Type
Run Code Online (Sandbox Code Playgroud)
问题是我不知道什么vb6类型可以代表std :: vector以调用DLL的函数.
注意:
- 我使用DLL的向量来添加对象.
- 我使用指针以尽可能少地使用内存.
- 对不起我的英语,这根本不是我的母语.
- 感谢您阅读并试图帮助我.
编辑:
- 我修复了输入问题(Ids肯定是由NullChar结束的,所以LPSTR应该这样做). - 我读了你的答案,我要感谢你们两位,你们的答案彼此接近,一个重大问题依然存在.我的DLL肯定需要向容器添加元素.因此,我想知道如何才能做到这一点.也许我可以为我的函数添加一个返回类型,然后使该函数能够返回它创建的项目(而不是直接将它放入容器中),以便vb6应用程序获取这些项目并能够处理它们,但是我无法弄清楚如何做到这一点 …
我正在使用一些C++代码来实现一个图形算法,该算法使用了很多小块内存(gSpan的亲戚,但这并不重要).代码在C++中实现,并使用std :: vectors来存储许多小元素(每个元素大约64个字节).但是,我在比原作者更大的数据集上使用它,而且我的内存不足.
然而,似乎我过早地耗尽了记忆.不成?我怀疑这是因为std :: vectors每次需要更多内存时都会尝试增加大小,并且向量会依赖于连续的内存.我有8GB内存和18GB交换,但是当抛出std :: bad_alloc时,我只使用6.5GB驻留和~8GB虚拟.我抓住了bad_alloc调用并打印出矢量大小,这就是我所看到的:
size: 536870912
capacity: 536870912
maxsize: 1152921504606846975
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Run Code Online (Sandbox Code Playgroud)
所以,显然,我们已达到向量的最大大小,并且库正在尝试分配更多,并且失败.
所以我的问题是:
由于我不知道最终会使用多少内存,我知道即使我进行了更改,仍然可能没有足够的内存来进行我的计算,但我怀疑我至少可以获得更多的内存然后我就是现在,这似乎很快就放弃了.
我有一个std :: vector实例,如下所示:
std::vector< std::pair<EndPointAddr*, EndPointAddr*>* > mServiceSubscriptionsList;
Run Code Online (Sandbox Code Playgroud)
底层std :: pair对象中的第一项是订户实体的网络地址,而第二项是订阅实体的网络地址.因此,std :: pair对象在此表示订阅作为订阅者和订阅端点地址对.
我想删除此向量中针对给定订户端点地址的所有订阅.为此,我在下面写了指示函数,其中我使用带谓词的std :: remove_if.根据std :: remove_if的文档,我的理解是std :: remove_if将所有出现的内容都删除到向量的末尾,并将向量的末尾向后移动到新的位置.
我的问题是:
如何在调用remove_if之后到达向量末尾的这些std :: pair项目,以便逐个动态地解除分配它们的内容(即解除对std :: pair*指针的攻击)?你能在下面的功能代码中指出所需的代码片段吗?我可以删除最后保留在迭代器中的第一个出现.但是,我不知道如何删除其余的出现.谢谢.
bool
XXX::removeSubscriptionForASpecificSubscriber(EndPointAddr * ptrSubscriberAddr)
{
auto last =
std::remove_if(mServiceSubscriptionsList.begin(),
mServiceSubscriptionsList.end(),
[ptrSubscriberAddr](std::pair<EndPointAddr*, EndPointAddr*>* thePair)
{
return ptrSubscriberAddr->getXXXAddress().compareTo(thePair->first->getXXXAddress());
});
if(last != mServiceSubscriptionsList.end())
{
//HERE I CAN DELET THE FIRST OCCURENCE, but WHAT I WANT IS TO DELETE ALL OCCURANCES
if(*last != nullptr)
{
delete *last;
}
mServiceSubscriptionsList.erase(last, mServiceSubscriptionsList.end());
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud) 我有一个Matrix类,它必须有一个接受未初始化列表的构造函数.contstructor必须获取值并将它们放在2D矢量,矩阵中.
这是我的2D矢量.
vector<vector<double>> d_matrix;
Run Code Online (Sandbox Code Playgroud)
这是我的构造函数.
Matrix::Matrix(initializer_list<initializer_list<int>> list)
{
d_row = list.size();
d_col = (*list.begin()).size();
initMatrix();
for (size_t r = 0; r < d_row; ++r)
{
for (size_t c = 0; c < d_col; ++c)
{
/* I need to do something here */
//d_matrix[r][c] = list.begin() + r) + c);
//cout << (*list.begin()).;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的init Matrix函数,以初始值开始.
void Matrix::initMatrix()
{
d_matrix.resize(d_col, vector<double>(d_row, 0));
}
Run Code Online (Sandbox Code Playgroud)
这就是我调用构造函数的方式.
Matrix m({ {1, 2, 3},
{3, 4, 2} }
);
Run Code Online (Sandbox Code Playgroud)
我设法获得列表的维度(d_row和d_col),但是我仍然试图从列表中提取值,尝试使用插入以及迭代器的开始和结束.未初始化的列表类似乎只有两个迭代器方法和一个size方法.我正在使用命名空间std btw.
问题是,我如何从未初始化的列表中获取值并将它们存储到我称为d_matrix的2D向量中.
我有一个类有成员的类 std:vector
private:
std::vector<int> myVector;
Run Code Online (Sandbox Code Playgroud)
我创建了Get方法来访问 myVector
1. const std::vector<int> GetMyVector() const;
2. const void GetMyVector(std::vector<int>& vec) const;
Run Code Online (Sandbox Code Playgroud)
实现分别如下:
1. const std::vector<int> MyClass::GetMyVector() const
{
return myVector;
}
2. const void MyClass::GetMyVector(std::vector<int>& vec) const
{
vec = myVector;
}
Run Code Online (Sandbox Code Playgroud)
两种Get方法中哪一种更好,为什么?
如果我想创建一个具有相同大小的向量的向量,如何用一条初始化行来完成呢?
例如
std::vector<std::vector<int>> vv(5) 将默认初始化5个向量,但是如何将这5个向量初始化为一个大小?
我想以我设置的比例创建一个随机1和0的向量(在我称之为dropout的程序中)该向量与先前创建的向量CSUM的大小相同.
在MATLAB中它会
dropout=0.9;
n_elements=size(CSUM)
drpoutmask = (rand(n_elements) > dropout);
Run Code Online (Sandbox Code Playgroud)
在C++我有
size_t elements = Csum.size();
std::vector<float> y(elements);
std::uniform_real_distribution<float> distribution(0.0f, 1.0f);
std::mt19937 engine; // Mersenne twister MT19937
auto generator = std::bind(distribution, engine);
std::generate_n(y.begin(), elements, generator);
std::vector<int> dropoutmask(elements,0);
float dropout=0.9;
for(int i=0; i<elements; i++)
{
if(y.at(i)>dropout)
{
dropoutmask.at(i)=1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪个有效,但对于巨大的向量是非常非常慢,有更快的方法来做到这一点?我是C++的新手.
任何帮助都感激不尽
我想创建一个动态矢量,每个矢量元素都是一个字符串数组.
我想到的数据结构是这样的:
VECTOR:
[0] = [str1, str2, str3]
[1] = [str1, str2, str3]
[2] = [str1, str2, str3]
Run Code Online (Sandbox Code Playgroud)
我正确地将值插入res变量但是我的代码无法正常工作:打印循环执行4次,但每次只打印LAST元素.我相信问题可能是:1)我没有在向量中正确推送字符串数组; 2)当我想打印它时,我没有正确管理向量和所有字符串的迭代.
这是我的代码:
std::vector<std::string*> DatabaseConnector::ExecuteQuery(std::string query, std::vector <std::string> columns)
{
std::vector<std::string*> results;
std::string res[columns.size() + 1]; // last value = '\0' to signal end of array
db_params.res = db_params.stmt->executeQuery(query);
while (db_params.res->next()) // Access column data by alias or column name
{
int i = 0;
for(std::string s : columns)
res[i++] = db_params.res->getString(s);
res[i] = "\0";
results.push_back(res);
}
for(auto el :results)
{
int …Run Code Online (Sandbox Code Playgroud) Following is my code for creating a map<int, vector<int>> and printing:
//map<int, vector>
map<int, vector<int>> int_vector;
vector<int> vec;
vec.push_back(2);
vec.push_back(5);
vec.push_back(7);
int_vector.insert(make_pair(1, vec));
vec.clear();
if (!vec.empty())
{
cout << "error:";
return -1;
}
vec.push_back(1);
vec.push_back(3);
vec.push_back(6);
int_vector.insert(make_pair(2, vec));
//print the map
map<int, vector<int>>::iterator itr;
cout << "\n The map int_vector is: \n";
for (itr2 = int_vector.begin(); itr != int_vector.end(); ++itr)
{
cout << "\t " << itr->first << "\t" << itr->second << "\n";
}
cout << endl;
Run Code Online (Sandbox Code Playgroud)
The printing part …