在我们的项目中,我们使用了很多"使用"来明确说明应该表示的变量.它主要用于std::string
像PortalId
或者这样的识别器CakeId
.现在我们目前可以做的是
using PortalId = std::string;
using CakeId = std::string;
PortalId portal_id("2");
CakeId cake_id("is a lie");
portal_id = cake_id; // OK
Run Code Online (Sandbox Code Playgroud)
我们不喜欢.我们希望在编译期间进行类型检查,以防止我们混合苹果和橙子,同时保留原始对象中的大多数yum yum方法.
所以问题是 - 这可以在C++中完成,使得使用将接近以下内容,分配将失败,我们仍然可以在地图和其他东西中使用它吗?
SAFE_TYPEDEF(std::string, PortalId);
SAFE_TYPEDEF(std::string, CakeId);
int main()
{
PortalId portal_id("2");
CakeId cake_id("is a lie");
std::map<CakeId, PortalId> p_to_cake; // OK
p_to_cake[cake_id] = portal_id; // OK
p_to_cake[portal_id] = cake_id; // COMPILER ERROR
portal_id = cake_id; // COMPILER ERROR
portal_id = "1.0"; // COMPILER ERROR
portal_id = PortalId("42"); // OK
return 0;
} …
Run Code Online (Sandbox Code Playgroud) 我正在搜索日志文件的大量行,并且我将这些行分发到组以便使用该re.match()
函数存储的正则表达式(RegExses).不幸的是,我的一些RegExses太复杂了,Python有时会让自己回归地狱.因此,我需要通过某种超时来保护它.
re.match
我正在使用,是Python的功能,正如我在StackOverflow上找到的那样(我真的很抱歉,我现在找不到链接:-().用运行Python的库来中断线程非常困难.这个原因线程已经脱离游戏.re.match
函数的评估花费的时间相对较短,而且我想用这个函数分析大量的行,我需要一些不需要太长时间才能执行的超时函数(这使得线程更不合适,需要很长时间才能初始化新线程)并且可以设置为小于一秒.我今天早上都在寻找这个问题的解决方案,但我没有找到任何满意的答案.
我尝试在C++中向二进制文件写入和读取类的对象.我不想单独编写数据成员,而是一次编写整个对象.举个简单的例子:
class MyClass {
public:
int i;
MyClass(int n) : i(n) {}
MyClass() {}
void read(ifstream *in) { in->read((char *) this, sizeof(MyClass)); }
void write(ofstream *out){ out->write((char *) this, sizeof(MyClass));}
};
int main(int argc, char * argv[]) {
ofstream out("/tmp/output");
ifstream in("/tmp/output");
MyClass mm(3);
cout<< mm.i << endl;
mm.write(&out);
MyClass mm2(2);
cout<< mm2.i << endl;
mm2.read(&in);
cout<< mm2.i << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但运行输出显示,无法读取写入二进制文件的mm.i值,并正确分配给mm2.i.
$ ./main
3
2
2
Run Code Online (Sandbox Code Playgroud)
那有什么不对呢?
通常在二进制文件中写入或读取类的对象时,我应该注意什么?
考虑以下方案.我们有3个文件:
main.cpp中:
int main() {
clock_t begin = clock();
int a = 0;
for (int i = 0; i < 1000000000; ++i) {
a += i;
}
clock_t end = clock();
printf("Number: %d, Elapsed time: %f\n",
a, double(end - begin) / CLOCKS_PER_SEC);
begin = clock();
C b(0);
for (int i = 0; i < 1000000000; ++i) {
b += C(i);
}
end = clock();
printf("Number: %d, Elapsed time: %f\n",
a, double(end - begin) / CLOCKS_PER_SEC);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
class.h:
#include …
Run Code Online (Sandbox Code Playgroud) 我需要将带有已删除的复制构造函数的结构绑定到函数.我已经减少了我想要达到的最小例子:
struct Bar {
int i;
Bar() = default;
Bar(Bar&&) = default;
Bar(const Bar&) = delete;
Bar& operator=(const Bar&) = delete;
};
void foo(Bar b) {
std::cout << b.i << std::endl;
}
int main()
{
Bar b;
b.i = 10;
std::function<void()> a = std::bind(foo, std::move(b)); // ERROR
a();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从编译器我只会哭泣和咬牙切齿:
test.cpp:22:27: error: no viable conversion from 'typename _Bind_helper<__is_socketlike<void (&)(Bar)>::value, void (&)(Bar), Bar>::type' (aka '_Bind<__func_type (typename decay<Bar>::type)>') to 'std::function<void ()>'
std::function<void()> a = std::bind(foo, std::move(b));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.1.0/../../../../include/c++/5.1.0/functional:2013:7: note: …
Run Code Online (Sandbox Code Playgroud) 我经常在这里看到关于提升的注释,例如
如果你使用Boost就可以了......
要么
如果你可以使用Boost ......
我想知道,那到底是什么?我应该厌倦什么?当我不能使用提升?不使用提升的原因是什么?在我看来,提升是STL的伟大扩展,有时非常重量级和笨拙,但仍然很好.
我并不是真的想要提出有关提升的意见.我正在寻找一些具体的例子,在使用boost之前我应该三思而后行.
我们对hadoop + yarn使用rancher模板,但似乎hadoop无法处理使用容器名称作为主机名(例如hadoop_namenode-primary_1
).
Caused by: java.net.URISyntaxException: Illegal character in hostname at index 13: http://hadoop_datanode_1:50075/webhdfs/v1/skystore/tmp/devtest_onedir/2016_08_19_02_35_35_32f7/header.json?op=CREATE&user.name=hdfs&namenoderpcaddress=10.42.14.252:8020&overwrite=true
Run Code Online (Sandbox Code Playgroud)
我做错了还是有一些解决方法?
正如我所看到的那样,问题是由于使用容器名称作为主机名而rancher创建带下划线的容器.不知道如何修复它...
有以下假设代码:
cdef extern from "string.h":
int strcmp(char* str1, char* str2)
def foo(list_str1, list_str2):
cdef unsigned int i, j
c_arr1 = ??
c_arr2 = ??
for i in xrange(len(list_str1)):
for j in xrange(len(list_str2)):
if not strcmp(c_arr1[i], c_arr2[j]):
do some funny stuff
Run Code Online (Sandbox Code Playgroud)
有没有办法将列表转换为c数组?
我已经阅读并尝试过Cython - 将字符串列表转换为char**,但这只会引发错误.
我所拥有的是对角矩阵类型Eigen::MatrixXi
.我需要对角线上的元素按升序排序.例如这样:
2 0 0 1 0 0
0 7 0 >>> 0 2 0
0 0 1 0 0 7
Run Code Online (Sandbox Code Playgroud)
我以为我会这样做:
std::sort(matrix.diagonal().begin(), matrix.diagonal().end());
Run Code Online (Sandbox Code Playgroud)
但显然Eigen::Diagonal
没有开始或结束功能.所以问题是,是否有任何方法使用内部std :: sort或任何类似优雅的东西在对角线上排序元素?
我浏览了官方文档,但没有找到任何有用的信息.
有一些任意的字符串,如
hello hello hello I am I am I am your string string string string of strings
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式找到由空格(EDIT)分隔的重复子字符串吗?在这种情况下,它将是'你好','我是'和'字符串'.
我一直想知道这个问题,但我仍然找不到任何真正的解决方案.我也阅读了一些关于这个主题的文章,并查看了后缀树,但这可以帮助我,即使我需要找到重复次数,例如重复次数高于2?
如果是这样,是否有一些python库,可以处理后缀树并对它们执行操作?
编辑:对不起,我不够清楚.所以只是为了说清楚 - 我正在寻找重复的子字符串,这意味着字符串中的序列,例如,正则表达式可以用+或{}通配符代替.所以,如果我必须从列出的字符串中制作正则表达式,我会这样做
(hello ){3}(I am ){3}your (string ){4}of strings
Run Code Online (Sandbox Code Playgroud) 我所拥有的是一个元素向量,我不关心它们的顺序.比我有N
从矢量中删除的元素的索引(每个寻址向量中的唯一位置).我希望删除尽可能快.
我能想出的最好的方法是在集合(订单索引)中存储索引:
std::set<unsigned int> idxs;
for (int i=0; i<N; ++i)
idxs.insert(some_index);
Run Code Online (Sandbox Code Playgroud)
然后以相反的顺序迭代集合并将索引替换为向量的最后一个元素.
std::set<unsigned int>::reverse_iterator rit;
for (rit = idxs.rbegin(); rit != idxs.rend(); ++rit) {
vec[*rit].swap(vec[vec.size() - 1]);
vec.resize(vec.size() - 1);
}
Run Code Online (Sandbox Code Playgroud)
然而,我在想是否有更有效的方法来做到这一点,因为使用套装对我来说似乎有点矫枉过正,我希望避免排序.
编辑1: 我们假设我使用向量并在之后对其进行排序.
std::vector<unsigned int> idxs;
for (int i=0; i<N; ++i)
idxs.push_back(some_index);
std::sort(idxs.begin(), idxs.end());
Run Code Online (Sandbox Code Playgroud)
我可以再推一下吗?
EDIT2: 我应该提到矢量最多有10个元素.然而,我的程序中的删除经常发生(数十万次).
我正在尝试解决需要在计算过程中存储帕累托最优解的问题。我将把一组帕累托最优解称为袋子。
到目前为止,我只有两个标准,这允许基于数组的非常有效的解决方案,其中元素根据第一个标准降序排序,并根据第二个标准升序。这种数组的一个例子是:
[(100, 0), (50, 1), (-10, 3)]
Run Code Online (Sandbox Code Playgroud)
(关于帕累托最优 - wiki)
但是最近我发现我需要添加第三个标准,对于这样的扩展,上述方法似乎不适用。我试图用谷歌搜索是否有人已经解决了这个问题,但没有发现任何令人满意的东西。也许我在问谷歌错误的问题。
更准确地说,我需要的是:能够存储相互非支配的帕累托最优元素的结构。我需要将元素插入到结构中,我需要遍历元素但没有特定的顺序。就我而言,通常不会有超过 4-5 个元素,但有时会多达 10-20 个。在我的算法中经常会插入包中,所以我需要它们尽可能快。
该应用程序是用 C++ 编写的,但它可能并不真正相关。
任何帮助将非常感激。
编辑:我已经有了自己的一些想法 - 将元素排列成某种三角形结构,但我无法将这个想法正式化。
Edit2:请注意,我要求在每次插入后,结构中只保留相互非支配的元素。例如,如果我有一组非支配三元组{(1,2,3), (3, 1, 1)}
并添加三元组,(3, 3, 3)
我将得到 set {(3,3,3)}
。
Edit3:为了更清楚元素的支配地位 - 我们说,在这种特殊情况下,当且仅当且至少一个不等式是严格的时,三元组(a,b,c)
占主导地位- 。(e,f,g)
a >= e && b >= f && c >= g
>
最近,gcc 实现了对 C++17 标准的实验性支持,其中一部分是概念。我读到了它并立即被它提供的所有好处迷住了。但我的问题是 - 当前的 STL 实现会使用概念进行改头换面吗?是这样吗,有大概什么时候吗?
从我的角度来看,如果至少algorithm
使用概念重新实现集合,以避免在缺少运算符或其他内容时出现不必要的长错误消息,那就太好了。
编辑: 显然我对 C++17 中的概念的理解是错误的。无论如何,关于STL概念升级的问题我相信仍然有效。