std::array专家解释了编程时C++ 11 的优点,但我希望从编译器中获得一些东西.能够打开.at()在编译使用的代码时使用时默认的范围检查[].
检查范围违规尤其是对于多维数组可能是有益的,因为在这种情况下,范围违规不太可能导致segfault(因为你经常在内部数组周围拥有内存,所以[5000][-123]仍然可能指向你拥有的内存).
所以我想知道是否有一个开关可以编译成检查范围的机器代码:
const uint32_t dim1=10*1000,dim2=3;
std::array<std::array<int, dim2>, dim1> test_2Darray;
int undefined_value=test_2Darray[dim2-1][dim1-1];
std::cout<<"ouch ("<<undefined_value<<")"<<std::endl;
int ok_value=test_2Darray[dim1-1][dim2-1];
std::cout<<"OK ("<<ok_value<<")"<<std::endl;
// test_2Darray.at(dim2-1).at(dim1-1); -->terminate called after throwing an instance of 'std::out_of_range'
// what(): array::at
Run Code Online (Sandbox Code Playgroud)
如果你问为什么我不切换到.at()- 我可能需要性能,我也有很多[]已编写的代码,而且我不够聪明,不能替代1D更换2D阵列.
我使用GCC 4.6
在我的任务:)尽可能多地使用STL我想知道是否可以使用std :: generate和std :: back_inserter组合,以便我可以执行与以下代码相同的操作:
static const size_t nitems=1024*1024;
std::string mrbig;
for (size_t pos=0; pos<nitems; ++pos)
mrbig.push_back('a'+ (rand()%26));
Run Code Online (Sandbox Code Playgroud)
我试过了
std::generate_n(std::back_inserter(mrbig),nitems,[](){return 'a'+(rand()%26);});
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,但我想确保我没有弄乱一些东西.
虽然我通过了指南,但我无法找到一种方法来执行以下操作:
我们有n个发布者,
我们有m个订阅者.
每个订阅者订阅某种类型的消息(一个发布者可以发送多种消息,多个发布者可以发出相同类型的消息).
如何在0MQ中创建N到N(或N到1到N)模式呢?
我有VS 2012终极RC,最近我对Scala感兴趣,所以我想知道是否有一种方法(插件)在VS中进行简单的Scala编程?谷歌搜索显示了一些可能的承诺,但这些信息已超过一年.我知道Scala在JVM上运行,但我提到的信息提到了.Net版本.
在
http://msdn.microsoft.com/en-us/devlabs/hh975426.aspx上阅读演员时,
我注意到序列化的部分:
由于序列化对于程序的正确功能至关重要并且很容易出错,因此C++ Actors库包含一个简单的消息定义生成工具"msgtool",给定XML文档将创建必要的类型和序列化定义.
我无法在VS命令提示符中找到msgtool,或使用谷歌搜索.
我知道shared_ptr,在相同类型的构造函数中用作RVR参数后unique_ptr,weak_ptr保证是空的,但我不知道标准是否为std::我提到的其他类型指定了这个.
请注意,我知道移动后的元素保持有效但未指定的状态,我在这里感兴趣的是指定了哪些类型的状态.
正确使用std :: swap是:
using std::swap;
swap(a,b);
Run Code Online (Sandbox Code Playgroud)
它有点冗长,但它确保如果a,b有更好的交换定义它将被选中.
所以现在我的问题是为什么std::swap没有使用这种技术实现,所以用户代码只需要调用std::swap?
所以这样的事情(noexcept为了简洁而忽略和约束):
namespace std {
namespace internal {
template <class T> // normal swap implementation
void swap(T& a, T& b) { // not intended to be called directly
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}
}
template <class T>
void swap(T& a, T& b) {
using internal::swap;
swap(a,b);
}
}
Run Code Online (Sandbox Code Playgroud) c++ template-function argument-dependent-lookup customization-point
您可能知道,C++17 字符串视图可以实现为一对 2 个指针(开始、结束)或指针(开始)和大小。我注意到在一个实现中它是用指针、大小来实现的。
这样做有充分的理由吗?或者这只是一个抛硬币的决定?
我想知道,因为向量实现通常有 3 个指针,而不是指针、大小、大小。
我唯一合理的解释是 .size() 可能比 .end() 被调用更频繁,因此我们对此进行优化(end 需要加法,但 size 无需计算)。
从 C++20 开始,std::isnan 不是 constexpr。
这有技术原因吗?
我能想到的只是它在“C 头文件”中,所以没有人费心去修复它(<limits>处理浮点数的函数是 constexpr,但不幸的numeric_limits是不包含 isnan 检查)。
我正在使用 C++23std::optional添加,但我不知道如何优雅地访问对象的值(如果optional处于活动状态)。
我知道我可以使用if,但这就是C ++20 。
我真的很喜欢 C++23 API 的变化,但我不知道如何跳过实现身份的样板。例如:
#include <functional>
#include <iostream>
#include <optional>
void print(std::optional<std::string>& name) {
name.transform([](std::string& x) {
std::cout << x << std::endl;
// I just want to print, without modifying optional, but next line is required
return x;
});
}
int main() {
std::optional<std::string> name{{"Bjarne"}};
print(name);
}
Run Code Online (Sandbox Code Playgroud)
感觉就像std::optional缺少invoke会员功能一样。
注意:在我的示例中,我在转换后不会链接任何其他内容,但为了简洁起见,我关心可选内容是否被修改。
c++ ×8
c++11 ×3
.net ×1
arrays ×1
c++14 ×1
c++17 ×1
c++20 ×1
c++23 ×1
casablanca ×1
constexpr ×1
optimization ×1
scala ×1
stdoptional ×1
stl ×1
zeromq ×1