我想将向量转换为该向量的子范围,例如通过删除第一个和最后一个值。在这种情况下使用assign成员函数是否有效?
std::vector<int> data = {1, 2, 3, 4};
data.assign(data.begin() + 1, data.end() - 1);
// data is hopefully {2, 3}
Run Code Online (Sandbox Code Playgroud)
对容器元素的所有迭代器,指针和引用均无效。过去的迭代器也无效。
但是,直到分配结束,这种无效似乎才发生。
为了安全起见,我可以采用以下内容,但似乎比较冗长:
std::vector<int> data = {1, 2, 3, 4};
data = std::vector<int>{data.begin() + 1, data.end() - 1};
// data is now {2, 3}
Run Code Online (Sandbox Code Playgroud) 我正在使用一个API,它将带有单个参数的函数作为回调.回调采用某种类型的单个参数,为简单起见,我会说它返回一个bool.我试图整理的主要内容是范围检查功能.我的直觉是写这样的东西:
template<class T, T min, T max>
constexpr bool in_range(T val) {
return (val >= min && val <= max);
}
static_assert(in_range<float, 0.0f, 1.0f>(0.5f), "doesn't work")
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,所以我默认以这种方式创建一个函数.
template<class T>
std::function<bool(T)> in_range(T min, T max) {
auto test = [min, max](T val) {
return (val >= min && val <= max);
};
return test;
}
assert(in_range<float>(0.0f, 1.0f)(0.5f))
Run Code Online (Sandbox Code Playgroud)
有没有办法以第一个函数的形式更多地编写函数,所以我不依赖std::function于运行时生成的lambdas?
我有一些 C++ 代码,我可以在其中切换枚举中的值。我试图用 -Wall -Wextra -Werror 编译它。这在使用 clang 时很好。但是,GCC 抱怨未涵盖默认代码路径。简化版本如下所示:
enum class Types: int {
A,
B,
C
};
bool some_logic(Types val) {
switch (val) {
case Types::A:
return (false);
case Types::B:
return (true);
case Types::C:
return (false);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过在函数末尾添加一个 default case 或另一个 return 语句来处理这个问题。但是,我的问题是为什么 GCC 没有检测到枚举的所有情况都已涵盖?或者换一种说法,海湾合作委员会在这里抱怨是否有正当理由?
我在此处对编译器输出进行了比较。