相关疑难解决方法(0)


我如何迭代枚举?

我只是注意到你不能在枚举上使用标准数学运算符,如++或+ =

那么迭代C++枚举中所有值的最佳方法是什么?

c++ enums

282
推荐指数
12
解决办法
29万
查看次数

基于C++ 11范围的循环:按值获取项目或引用const

读取基于范围环的一些例子他们建议两种主要方式1,2,3,4

std::vector<MyClass> vec;

for (auto &x : vec)
{
  // x is a reference to an item of vec
  // We can change vec's items by changing x 
}
Run Code Online (Sandbox Code Playgroud)

要么

for (auto x : vec)
{
  // Value of x is copied from an item of vec
  // We can not change vec's items by changing x
}
Run Code Online (Sandbox Code Playgroud)

好.

当我们不需要更改vec项目时,IMO,示例建议使用第二个版本(按值).为什么他们不提出const引用的内容(至少我没有找到任何直接的建议):

for (auto const &x : vec) // <-- see …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

199
推荐指数
3
解决办法
8万
查看次数

如何使用std :: array模拟C数组初始化"int arr [] = {e1,e2,e3,...}"的行为?

(注意:这个问题是不必指定元素的数量,仍然允许直接初始化嵌套类型.)
这个问题讨论了C数组的用途int arr[20];.在他的回答中,@ James Kanze展示了C阵列的最后一个据点,它具有独特的初始化特性:

int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Run Code Online (Sandbox Code Playgroud)

我们没有必要指定元素的数量,万岁!现在遍历它与C++ 11的功能std::beginstd::end<iterator>(或您自己的变体),你永远需要甚至认为它的大小.

现在,有没有(可能是TMP)方法实现同样的目标std::array?使用宏可以使它看起来更好.:)

??? std_array = { "here", "be", "elements" };
Run Code Online (Sandbox Code Playgroud)

编辑:中间版本,从各种答案编译,如下所示:

#include <array>
#include <utility>

template<class T, class... Tail, class Elem = typename std::decay<T>::type>
std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)
{
  return { std::forward<T>(head), std::forward<Tail>(values)... };
}

// in code …
Run Code Online (Sandbox Code Playgroud)

c++ arrays templates initialization c++11

133
推荐指数
8
解决办法
1万
查看次数

卖我的正确性

那么为什么总是建议尽可能经常使用const呢?在我看来,使用const可能比C++中的帮助更痛苦.但话说回来,我是从python的角度来看这个:如果你不想改变某些东西,不要改变它.所以说,这里有几个问题:

  1. 似乎每次我将某些东西标记为const时,我都会收到错误,并且必须将某些其他函数更改为const.然后这导致我必须在其他地方更改另一个功能.这是通过经验变得更容易吗?

  2. 使用const的好处真的足以弥补麻烦吗?如果您不打算更改对象,为什么不编写不会更改它的代码?

我应该注意到,在这个时间点,我最关注的是使用const来实现正确性和可维护性的好处,尽管了解性能影响也很好.

c++ const-correctness

121
推荐指数
13
解决办法
2万
查看次数

枚举类可以转换为基础类型吗?

有没有办法将enum class字段转换为基础类型?我认为这将是自动的,但显然不是.

enum class my_fields : unsigned { field = 1 };

unsigned a = my_fields::field;
Run Code Online (Sandbox Code Playgroud)

该任务被海湾合作委员会拒绝.error: cannot convert 'my_fields' to 'unsigned int' in assignment.

c++ c++11

105
推荐指数
3
解决办法
4万
查看次数

C++ 11基于范围的for循环效率"const auto&i"与"auto i"

在C++ 11中,我可以迭代一些容器,如下所示:

for(auto i : vec){
   std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但我知道这是不必要的 - 不必要的,因为我只需要打印 -的值vec- 制作(编辑:每个元素)的副本vec,所以我可以这样做:

for(auto &i : vec){
   std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是我想确保它们的值vec永远不会被修改并遵守const-correctness,所以我可以这样做:

for(const auto &i : vec){
   std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如果我只需要查看某个容器的值,那么最后的循环(const auto &i)是否总是首选,因为没有额外副本(编辑:每个元素)的效率提高vec

我正在开发一个我正在开发的程序,我正在考虑在整个过程中进行这种改变,因为效率是至关重要的(我在第一时间使用C++的原因).

c++ for-loop auto c++11

55
推荐指数
2
解决办法
2万
查看次数