我std::map在我的项目中使用了一个,因为我想要将几个不同的字符串相互映射.例如,我可能会创建一个类似于此的地图:
std::map<std::string, std::string> map;
map["test"] = "Foo";
map["blah"] = "Drei";
map["fayh"] = "Najh";
// And so on...
Run Code Online (Sandbox Code Playgroud)
我想使用比地图中的键更长的键找到这些值,即部分匹配键.地图中的所有键与它们所比较的键共享相同的前缀
这就是我想要实现的目标:
// Same map as earlier
std::cout << map.find('test123').second; // Should output 'Foo'
std::cout << map.find('test_2165').second; // Should output 'Foo' as well
std::cout << map.find('tes').second; // Key not found
std::cout << map.find('fayh_TK_Ka').second; // 'Najh'
Run Code Online (Sandbox Code Playgroud)
我希望你明白我的意思.我想有效地检索映射到键的值,这些键对应于比它们大的比较键,但共享相同的前缀(例如'test').
我不知道std::map在这种情况下是否是最佳选择,如果没有,请告诉其他选项.
注意:我已经尝试使用带有std::greater_equal关键比较器的地图结合lower_bound方法,但我最终得到了运行时错误,我也质疑这种方法的效率.
感觉就像我在滥用Stackoverflow所有的问题,但毕竟这是一个Q&A论坛:)无论如何,我一直在使用弯路一段时间,但我还没有实现我自己的一个(我用过包装纸)更早).既然我想完全控制我的代码(谁没有?)我决定自己实现一个功能齐全的绕行器,所以我可以理解我代码的每一个字节.
代码(下面)尽可能简单,但问题不然.我已经成功实现了绕行(即我自己的功能的钩子),但我还没能实现蹦床.
每当我调用蹦床时,根据我使用的偏移量,我会得到"分段错误"或"非法指令".两种情况都结束了相同; '核心倾销'.我认为这是因为我混淆了"相对地址"(注意:我对Linux很新,所以我远远没有掌握GDB).
如代码中所述,取决于sizeof(jmpOp)(在第66行)我得到非法指令或分段错误.我很抱歉,如果这是显而易见的事情,我熬夜太晚了......
// Header files
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include "global.h" // Contains typedefines for byte, ulong, ushort etc...
#include <cstring>
bool ProtectMemory(void * addr, int flags)
{
// Constant holding the page size value
const size_t pageSize = sysconf(_SC_PAGE_SIZE);
// Calculate relative page offset
size_t temp = (size_t) addr;
temp -= temp % pageSize;
// Update address
addr = (void*) temp;
// Update memory area protection
return !mprotect(addr, pageSize, flags); …Run Code Online (Sandbox Code Playgroud) 我有一个包含几个不同形状的画布,它们都是静态的,并且绑定到视图模型(MVVM)中的不同属性.截至目前,画布定义如下(简化):
<Canvas>
<Polygon Fill="Red" Stroke="Gray" StrokeThickness="3" Points="{Binding StorageVertices}" />
<Ellipse Fill="Blue" Width="{Binding NodeWidth}" Height="{Binding NodeHeight}" />
<!-- And some more static shapes -->
<!-- ... -->
</Canvas>
Run Code Online (Sandbox Code Playgroud)
对于这个画布,我想添加一个动态列表,其中每个条目都转换为多边形.我认为最好的方法是ItemsControl.这是我在我的方法中使用的,但只显示了集合(列表)中的第一个项目.
<Canvas>
<!-- ... -->
<!-- Same canvas as earlier with the addition of the ItemsControl -->
<ItemsControl ItemsSource="{Binding Offices, Mode=OneWay, Converter={...}}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Polygon Fill="AliceBlue" Stroke="Gray" StrokeThickness="1" Points="{Binding Points}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Canvas>
Run Code Online (Sandbox Code Playgroud)
使用此代码,仅Offices显示集合中的第一个项目.怎么会?如果我查看可视树,则所有多边形都在其中.我很新的WPF,所以我只能猜测,但我的第一个念头是的默认StackPanel为ItemPresenter可能是在这种情况下不合适,但我只能猜测...
我已经尝试了一个多小时来修复我的makefile但是我打破了比我修复更多的东西.无论如何,我对Makefiles非常(非常)新手,我几乎没有经验.我的问题是我的makefile重新编译每个源文件,即使已经构建了目标文件(并且源尚未更新).因为makefile非常像声明性编程,所以我不知道我做错了什么.
对不起,简短说明买我在这个领域的知识是非常有限的...
#---------------------------------------------------------
# Compiler and linker flags
#---------------------------------------------------------
CC = g++
CMNFLAGS = -ggdb3 -Wextra -Wall -Wno-int-to-pointer-cast -Wno-reorder -Wno- write-strings -DOPT_TYPE="\"debugging\""
CFLAGS = $(CMNFLAGS) -fPIC
LDFLAGS = $(CMNFLAGS) -shared -ldl -lm -static-libgcc
#---------------------------------------------------------
# All the different directories
#---------------------------------------------------------
BUILD = build
SOURCE = source
INCLUDE = include
TARGET = $(BUILD)/$(shell basename $(CURDIR))_mm_i386.so
#---------------------------------------------------------
# Directory and include variables/files
#---------------------------------------------------------
SRCSDK = ../sdk
METADIR = $(INCLUDE)/metafiles
INSTDIR = /usr/local/test/$(shell basename $(CURDIR))/dlls
INCLUDES = -I$(INCLUDE) -I$(METADIR) -I$(SRCSDK)/engine -I$(SRCSDK)/common \
-I$(SRCSDK)/pm_shared …Run Code Online (Sandbox Code Playgroud) 如何在AArch64 上使用尽可能少的指令执行绝对跳转(64 位双字),同时使用相对于程序计数器的数据源?
乍一看,人们可能会认为 aLDR后跟 a BR是可能的,即:
LDR x9, [PC, #0x8];
BR x9
.dword 0xBADC0FFEE0DDF00D
Run Code Online (Sandbox Code Playgroud)
但由于PC不再是AArch64上的通用寄存器,因此不是。
那么,如何用尽可能少的指令来做到这一点呢?
我最近一直在绕道而行,并且随之而来.我绕道了很多不同的功能; thiscall,stdcall,cdecl,虚函数等.但有一件事我没有管理(甚至可能不可能),那就是挂钩基类虚函数.例如; 有一个Car类声明了一个虚函数(空)Drive.然后还有3个继承汽车和工具的汽车类Drive.
如果我挂钩Car(基类)Drive函数(使用一个简单的'jmp'钩子)它会被触发时的后代Car触发Drive,如果它们不调用基函数?
更彻底地解释一下:
class Car
{
virtual void Drive(void) { } // Empty virtual function
}
class Lamborghini : public Car
{
void Drive(void) { // does lots of stuff, but does NOT call base function }
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道基本方法是否被调用或者是否可以以某种方式挂钩?函数exectution 直接跳转到Lamborghini::Drive或以某种方式通过Car类,所以只要后代调用它就可以检测到Drive吗?
编辑:如果基类函数为空,是否可以挂钩它,因为它需要5个字节的空间?