我正在寻找一种独立于编程语言或集合类型来定义集合查询的方法。
详细来说,这将是 Java、C++、Python 等常见语言的语言定义和实现。
正如所评论的,我不是在寻找数据库或集合表示的任何实现,而只是寻找一种定义元素查询的方法,例如Pythonstd::set/vector或set()任何可以视为集合的线性结构。
一个类似的例子是jLinq之类的东西,但不依赖于 JSON 或 javascript,并且具有明确定义的字符串表示形式。
当然,如果不知道数据结构的类型,您就必须为每个问题和每种编程语言实现任何条件过滤器,但是构造查询字符串的方式以及如何评估它们将会很清楚,并且您不必编写解析器。
所以我想用 Java 或 C++ 编写类似于
q = query()
.created_after("14.03.2010")
.and(contains("hello")
.or(contains("hallo")))
.sort("caption")
Run Code Online (Sandbox Code Playgroud)
或写为字符串:
"(created_after("14.03.2010") and ( contains("hello") or contains("hallo"))) sort("caption")"
Run Code Online (Sandbox Code Playgroud)
(这没有经过深思熟虑 - 只是为了展示界面的外观)
JSON 或 XML 是解决不同问题的一个很好的例子:清晰的语言定义和适用于任何平台或编程语言的解析器/工具。
我承认这个问题在此之前已经被问到,但是现在是4年前,我敢于要求更新:
我需要一种方法来将一个元组/对添加到容器中并有效地搜索左侧和右侧元素.
升压具有bimap和multi_index该做的正是我想要的,但我不知道什么是纯现代C++推荐的替代方案- 11/14如果你不希望引入的依赖性提高(无论何种原因).
链接中的一个答案表明不需要s.th. 由于透明的比较器,更像是一个bimap .接受的答案表明将std::maps与key1- > key2和key2- > 组合在一起的实现key1.
我真的不知道透明比较器如何帮助我,我只是好奇是否有一些这是你应该怎么做以及为什么 - 解决方案.你能提供一些提示/链接吗?
我使用CMake (3.4.1)根据Boost库构建了一个 C++ 项目。宿主平台为Linux,目标为宿主和交叉构建的Android NDK。
我只使用 Boost 头文件,我刚刚下载/提取了 boost 文件夹(我没有/usr/include/boost目录)。
在我的CMakeLists.txt文件中,我像这样声明了对 Boost 的依赖:
find_package(Boost 1.57 REQUIRED)
Run Code Online (Sandbox Code Playgroud)
我像这样配置我的构建:
BOOST_ROOT=/path/to/boost cmake ../src
Run Code Online (Sandbox Code Playgroud)
这实际上工程预期为我的本地版本。
当我现在以完全相同的方式配置构建时(仅指定更多环境变量和 CMAKE_TOOLCHAIN_FILE)CMake 给了我:
BOOST_ROOT=/path/to/boost JAVA_HOME=/bla/bla/bla \
ANDROID_NDK=/bla/bla/bla \
ANDROID_SDK=/bla/bla/bla \
ANT=/usr/bin/ant \
cmake ../src -DCMAKE_TOOLCHAIN_FILE=/bla/bla/android.toolchain.cmake
CMake Error at /usr/share/cmake/Modules/FindBoost.cmake:1247 (message):
Unable to find the requested Boost libraries.
Unable to find the Boost header files. Please set BOOST_ROOT to the root
directory containing Boost or …Run Code Online (Sandbox Code Playgroud) 是否有一个概念可以确保向现有类添加成员会产生某种错误/警告,以防实现者忘记扩展应处理所有成员的方法?
如果一个类实现了多个必须触及所有元素的方法(例如导入/导出),则很容易忘记一个或多个要适应的方法。编译器不会识别它,并且在很多情况下其行为将符合预期(当然,除非您有正确的测试。)
我当前的尝试是在每个可能被默默遗忘的方法中测试类的大小。但当然,这不容易阅读,不安全,并且不独立于编译器/平台/构建类型(所以我不喜欢它)。
class C
{
int element1;
int element2;
int element3; <--- newly added without adapting operator==()
public:
void import_me();
void export_me();
bool operator== (const C&);
void dump();
};
Run Code Online (Sandbox Code Playgroud)
该实现可能隐藏在不同/大文件中:
void C::import_me(){
assert( sizeof( *this ) == 12 ); // this is my attempt of doing this
read_fn( element1 );
read_fn( element2 );
read_fn( element3 );
}
void C::export_me(){
assert( sizeof( *this ) == 12 ); // this is my attempt of doing this
write_fn( element1 );
write_fn( element2 …Run Code Online (Sandbox Code Playgroud) 我有一个与std::string 格式非常相似的问题,例如 sprintf或这个问题,但这些问题非常旧,所以我敢于重试以收集一些方法。
我想要一个函数/方法,它接受参数来定义带有一些变量的格式化字符串,很像printf/ sprintf。例如,它可以是一种send_string(ARGS)格式化字符串并将其发送到某个接收者的方法。例如:
server->send_message("value1: %d, value2: %0.3f, value3: %s", 2, 3.14, "hello world");
Run Code Online (Sandbox Code Playgroud)
我知道流的概念,我也知道boost::format。但我想知道没有不必要的依赖关系的最简单的方法是什么。
这是我的想法:
使用基于流的方法- 结果将如下所示:
server->msg_out() << "value1: " << 2
<< ", value2: " << 3.14
<< ", value3: '" << "hello world" << "'";
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来最合理,但它非常冗长,很难看出输出会是什么样子。特别是当您尝试实现表格输出或实际值的特殊格式时。从好的方面来说,你没有任何依赖性。
使用基于 C 的变量参数。看起来就像上面的例子,尽管它已被弃用、容易出错且不灵活,但它是众所周知的并且被大量使用。
server->send_message(boost::format(
"value1: %d, value2: %0.3f, value3: %s") % 2 % 3.14 % "hello world")); …Run Code Online (Sandbox Code Playgroud)我发现了很多关于克隆存储库并立即检查给定提交 ID 的问题/答案。简单的方法:
git clone <URL> working-copy
cd working-copy; git checkout <COMMIT-ID>
Run Code Online (Sandbox Code Playgroud)
通过分支机构,您可以git clone -b <BRANCH> <URL>
使用分支,您还可以进行浅克隆,这使得克隆速度更快,但您无法再检出任意 ID。
所以我的问题是:有没有一种方法可以对给定的 URL/提交 ID 进行浅表克隆,而无需在远程创建分支?
不同类型的远程存储库有区别吗?(例如本地文件系统、BitBucket、GitHub、GitLab 等)
想象一个包含(逗号)分隔元素的字符串,例如版本字符串
version_str = "3,1,4,159"
Run Code Online (Sandbox Code Playgroud)
其中可能或多或少包含一个或多个元素:
version_str = "3,1,4"
Run Code Online (Sandbox Code Playgroud)
或者
version_str = "3,1,4,159,appendix"
Run Code Online (Sandbox Code Playgroud)
我想像这样分开这些元素:
major, minor, patch, revision, appendix = version_str.split(',')
Run Code Online (Sandbox Code Playgroud)
然后我当然会得到一个ValueError,因为提取的元素数量并不总是匹配。
有没有办法得到extend结果split(),例如这样:
version_str.split(',', min_elements=5)
Run Code Online (Sandbox Code Playgroud)
或者
version_str.split(',').extend(5, default='')
Run Code Online (Sandbox Code Playgroud)
?
例子:
>>> '3,1,4'.split(',', min_elements=5)
['3', '1', '4', '', '']
>>> '3,1,4,159,dev'.split(',', min_elements=5)
['3', '1', '4', '159', 'dev']
Run Code Online (Sandbox Code Playgroud)
当然,我可以随后手动添加元素或有条件地读取元素,但我对 pythonic one-liner 感兴趣。
我发现很多网站解释ssh 端口转发、ssh 反向代理、ssh 多路复用sshpiper等,涉及sslh、运行 ssh 袜子服务器、配置本地 SSH 服务器等等。所以我现在很困惑,可能会问一个非常常见和/或简单的问题:
正如您可能已经从标题中猜到的那样,我想在 docker 容器内设置一个 git 服务器 (GitLab),监听端口 22 上的 SSH 连接,而不必使用不同的端口进行默认 ssh 操作(终端、scp 等......)在主机上(按照此处的建议)
IE
ssh alice@myserver.org应该仍然是可能的以及git clone git@myserver.com:path/to/project如果您喜欢图片:
+------ myserver.org --------+
| +----+ +- typical -+ |
+--------+ alice@myserver.org:22 | | | | SSH | |
| client | ----------------------> -+--+----+---->| service | |
+--------+ all names but `git` | | …Run Code Online (Sandbox Code Playgroud) 您可能知道这样的情况,您只想分配一个const带有表达式的()变量,该表达式可能会失败(抛出)(例如container.at()),这会迫使您编写样板代码:
void foo(const string &key) {
auto it = data_store.find(key);
if (it == data_store.end()) {
return;
}
const auto & element = it->second;
...
go on with `element`...
...
}
Run Code Online (Sandbox Code Playgroud)
在Python中,您可以编写如下代码:
def foo(name):
try:
element = data_store[key]
except KeyError:
return
..
go on with `element`
..
Run Code Online (Sandbox Code Playgroud)
..因为你没有引入那些无用的额外it只是为了检查存在而没有噪音.
如果C++ try不会引入变量作用域,你可以使用at():
void foo(const string &key) {
try {
const auto & element = data_store.at(key);
} catch (const out_of_range &) {
return;
}
... …Run Code Online (Sandbox Code Playgroud) 在CMake中,您可以将TARGET_INCLUDE_DIRECTORIES()add include目录作为系统 include目录(即use -isystem),以免弹出根于第三方代码的警告:
TARGET_INCLUDE_DIRECTORIES(mytarget
SYSTEM
${3rdPartyLib_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用TARGET_LINK_LIBRARIES它,这也使来自第三方库的包含目录可用。据我所知,TARGET_LINK_LIBRARIES不支持将SYSTEM修饰符添加为系统包含目录的那些目录。
我做错了吗?
有没有办法使:
TARGET_LINK_LIBRARIES(mytarget
${3rdPartyLib_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)
使用-isystem?(或通过抑制警告的任何其他方式3rdPartyLib)。