我只是想知道我应该使用std::size_tfor循环和东西而不是int?例如:
#include <cstdint>
int main()
{
for (std::size_t i = 0; i < 10; ++i) {
// std::size_t OK here? Or should I use, say, unsigned int instead?
}
}Run Code Online (Sandbox Code Playgroud)
一般来说,何时使用的最佳做法是什么std::size_t?
我一直在用c ++工作一段时间,但我不确定它们之间的区别
public : Thing(int _foo, int _bar): member1(_foo), member2(_bar){}
Run Code Online (Sandbox Code Playgroud)
和
public : Thing(int _foo, int _bar){
member1 = _foo;
member2 = _bar;
}
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,他们做同样的事情,但这两种语法之间是否存在实际差异.其中一个比另一个更安全,它们是否以不同方式处理默认参数.
不完全习惯于第一个例子,所以如果我犯了错误,我道歉.
在以下代码中:
std::vector<int> var;
for (int i = 0; i < var.size(); i++);
Run Code Online (Sandbox Code Playgroud)
size()成员函数是为每个循环迭代调用的,还是仅调用一次?
(是的,我知道有一个问题几乎相同的标题,但得到的答复是不能令人满意的,见下文)
编辑抱歉,原始问题没有使用编译器优化.现在已经修复了这个问题,但是为了避免琐碎的优化并且更接近我的实际用例,测试已经分成两个编译单元.
std::vector<>具有线性复杂性的构造函数在性能关键应用程序方面是一个令人讨厌的事实.考虑这个简单的代码
// compilation unit 1:
void set_v0(type*x, size_t n)
{
for(size_t i=0; i<n; ++i)
x[i] = simple_function(i);
}
// compilation unit 2:
std::vector<type> x(n); // default initialisation is wasteful
set_v0(x.data(),n); // over-writes initial values
Run Code Online (Sandbox Code Playgroud)
当构建时浪费了大量时间x.正如这个问题所探讨的那样,传统的方法似乎只是保留存储和使用push_back()来填充数据:
// compilation unit 1:
void set_v1(std::vector<type>&x, size_t n)
{
x.reserve(n);
for(size_t i=0; i<n; ++i)
x.push_back(simple_function(i));
}
// compilation unit 2:
std::vector<type> x(); x.reserve(n); // no initialisation
set_v1(x,n); // using push_back()
Run Code Online (Sandbox Code Playgroud)
然而,正如我的评论所指出的那样,push_back()本质上是缓慢的,这使得第二种方法实际上比第一种方法慢 …
c++ ×4
c++11 ×1
containers ×1
for-loop ×1
idiomatic ×1
loop-counter ×1
parameters ×1
performance ×1
size-t ×1
stdvector ×1
types ×1
vector ×1