我正在尝试扩展别人的代码,它经常使用std :: queue和std :: pair类型.对于下面的代码,我需要扩展std :: pair.second中的变量数量,并希望它对于像数组这样的变量数量更加灵活(以便将来修改).
someClass->myQueue.push(std::pair<T1,uint64_t>(var1, var2));
Run Code Online (Sandbox Code Playgroud)
所以我尝试做类似的事情:
someClass->myQueue.push(std::pair<T1,uint64_t[N]>(var1,{e1,e2,...,eN}));
Run Code Online (Sandbox Code Playgroud)
在修改代码中的相关定义等后,我得到了以下错误和警告,我对此一无所知.然而,听起来这不是进行这种修改的适当方式.
myArray = myQueue.front().second;
^
error: invalid array assignment
...
someClass->myQueue.push(std::pair<T1,uint64_t[N]>(var1,{e1,e2,...,eN}));
^
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
Run Code Online (Sandbox Code Playgroud)
我在网上看到了元组和std :: pair作为解决方案的递归用法,但我想对代码进行最小的更改,因为几个类将受此影响.这样做的正确方法是什么?
谢谢
我试图从for循环中的地图中获取一个元素.按照cppreference的例子我试试这个:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, int> mapping;
mapping.insert(pair<int, int>(11,1));
mapping.insert(pair<int, int>(12,2));
mapping.insert(pair<int, int>(13,3));
for (const auto &it : mapping)
mapping[it]++;
cout << "array: ";
for (const auto &it : mapping)
cout << it.second << " ";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这给出了gcc的以下编译错误:
main.cpp: In function 'int main()':
main.cpp:15:16: error: no match for 'operator[]' (operand types are 'std::map<int, int>' and 'const std::pair<const int, int>')
mapping[it]++;
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,问题是auto解决了std::pair<const int, int>没有[]定义运算符的问题.我想知道是否有办法让这个工作. …
在我的应用程序中,我使用c ++ std map和char*作为键.下面是使用迭代器从映射中删除数据条目的代码示例.
// map declaration in the code
map<VcmU8T*, time_t, DataMapStrCmpT> mDataMap;
auto it = mDataMap.find(apKey);
if (it != mDataMap.end()) {
mDataMap.erase(it);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是否清除(释放)键指针的内存?
所以我有这个定义:
using HistoryDataItemList = list<CHistoryDataItem>;
HistoryDataItemList m_listHistoryItems;
Run Code Online (Sandbox Code Playgroud)
而这种方法:
bool CHistoryData::HasHistoryForAssignment(ASSIGN_TYPE_E eAssignType)
{
bool bHasHistoryForAssignment = false;
auto iter = m_listHistoryItems.begin();
for (; iter != m_listHistoryItems.end(); iter++)
{
if (iter->GetAssignmentType() == eAssignType)
{
bHasHistoryForAssignment = true;
break;
}
}
return bHasHistoryForAssignment;
}
Run Code Online (Sandbox Code Playgroud)
我知道使用像C#这样的语言可以简化代码,但是在使用较新的C++ 11时,还可以使用MFC吗?或者我所写的内容非常简单?
谢谢.
我正在尝试删除以下地图:
typedef bool (myClass::*func)(std::vector<std::string> &args);
typedef std::map<std::string, func> myMap;
myMap map; //map of functions in the class 'myClass'
void deleteMap()
{
for(myMap::iterator it = map.begin(); it != map.end(); ++it)
{
delete it->second; //compiler says it->second is non-pointer type
map.erase(it);
}
}
Run Code Online (Sandbox Code Playgroud)
'map' 将字符串映射到类 'myClass' 中的函数,该函数在其参数中采用字符串向量。
在我尝试删除此映射时,我试图删除指向成员函数的指针,然后擦除迭代器本身。编译器说 it->second 必须是指针类型。在 typdef 'func' 是一个指向 myClass:: 的指针,那么为什么我会收到这个错误?
这是删除函数映射的合适方法吗?
考虑以下片段:
MapT map;
map["A"] = 1;
map["B"] = 2;
map["C"] = 3;
map["D"] = 4;
map["E"] = 5;
MapT mapSecond;
mapSecond["A"] = 10;
mapSecond["B"] = 20;
mapSecond["C"] = 30;
mapSecond["X"] = 4;
mapSecond["Y"] = 5;
MapT::const_iterator itSecond = mapSecond.begin();
MapT::iterator it = map.begin();
for (; itSecond != mapSecond.end(); ++itSecond)
{
std::pair<MapT::iterator, bool> pair = map.insert(std::make_pair(itSecond->first, itSecond->second));
if (!pair.second)
{
pair.first->second = itSecond->second;
}
}
for (; it != map.end(); ++it)
{
std::cout << it->first << " " << it->second << …Run Code Online (Sandbox Code Playgroud) 我正在初始化一个shared_ptr以映射到一个名为GetData的单独函数中.此映射作为参数传递给GetData函数.但是,在main中,map在调用GetData函数后返回空.
#include <memory>
#include <map>
void GetData(std::shared_ptr<std::map<int, int>> data);
int main()
{
std::shared_ptr<std::map<int, int>> data2 = std::make_shared<std::map<int, int>>();
GetData(data2);
return 0;
}
void GetData(std::shared_ptr<std::map<int, int>> data)
{
data = std::make_shared<std::map<int, int>>
(std::initializer_list<std::map<int, int>::value_type>{
{ 1, 2 },
{ 5, 6 },
{ 4, 5 }
});
}
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
更新: 如果在参数仍未通过引用传递的情况下重写方法如下,我确实在调用GetData方法后在main中填充了map.
void GetData(std::shared_ptr<std::map<int, int>> data)
{
data->insert(std::pair<int, int>(1,2));
data->insert(std::pair<int, int>(45, 2));
}
Run Code Online (Sandbox Code Playgroud) 我只是想知道我是否可以使用const_iterator更改/更新地图的值。
下面是代码片段:
int main()
{
map <int, int> m;
m.insert(make_pair(1, 10));
map <int, int>::const_iterator itr = m.begin(); //The iterator is const_iterator
itr->second = 30;
cout << itr->second; //The value to be printed is 30, and not 10.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
预先感谢您分享您的想法。
我有 2 张不同大小的地图(字符串、字符串)。我需要比较并返回地图中存在的不同项目。
eg: map1 contains
"1":"abc"
"2":"xyz"
"3":"abc"
eg: map2 contains
"1":"abcd"
"2":"xyz"
"4":"abc"
"5":"abc"
Run Code Online (Sandbox Code Playgroud)
如果比较 2 张地图,则只匹配“2”。剩下的无可匹敌。我需要把所有无与伦比的东西都放到另一张地图上。
我使用此代码从地图容器中删除等于某个 int 的元素。
for(auto x:m){
if((x.second)==element)m.erase(x.first);
}
Run Code Online (Sandbox Code Playgroud)
结果是分段错误。我也试过这个:
for(map<int,int>::iterator i=m.begin();i!=m.end();i++){
if((i->second)==element)m.erase(i);
}
Run Code Online (Sandbox Code Playgroud)
结果一样。如果将 i++ 放入 if/else 程序将冻结/循环或其他什么。我怎样才能解决这个问题?