考虑:
std::vector<int> v;
v.reserve(1);
v.push_back(1); // is this statement guaranteed not to throw?
Run Code Online (Sandbox Code Playgroud)
我之所以选择int它是因为它没有可以抛出的构造函数 - 显然如果T的一些复制构造函数抛出,那么该异常就会逃脱vector<T>::push_back.
这个问题适用于尽可能多insert的push_back,但它的灵感来自于它是安全的push_back"动态分配的对象",以矢量?,这恰好询问push_back.
在C++ 03和C++ 0x标准/ FCD中,描述vector::insert如果没有发生重新分配,插入点之前的迭代器/引用仍然有效.他们没有说如果没有重新分配,就不会抛出任何异常(除非来自T的构造函数等).
标准中有其他任何东西可以保证吗?
我不希望push_back做任何可以抛出这种情况的事情.GNU实现没有.问题是标准是否禁止它.
作为后续行动,任何人都可以想到任何实施会抛出的原因吗?我能想到的最好的方法是,如果一个调用reserve结束时将容量增加到一个超过的值max_size(),那么insert可能length_error会在超过最大值时抛出.增加容量是没用的max_size(),但是我没有立即看到任何禁止的东西,或者[编辑:你的分配器可能会阻止你增加容量max_size,所以这个建议可能不好.]
这是一些代码(完整程序后面的问题):
template <typename T>
T fizzbuzz(T n) {
T count(0);
#if CONST
const T div(3);
#else
T div(3);
#endif
for (T i(0); i <= n; ++i) {
if (i % div == T(0)) count += i;
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我用这个模板函数调用int,那么根据我是否定义CONST,我得到6个性能差异:
$ gcc --version
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
$ make -B wrappedint CPPFLAGS="-O3 -Wall -Werror -DWRAP=0 -DCONST=0" &&
time ./wrappedint
g++ -O3 -Wall -Werror -DWRAP=0 -DCONST=0 wrappedint.cpp -o wrappedi
nt
484573652
real …Run Code Online (Sandbox Code Playgroud) 我在一个目录中有几个python模块.
在同一目录中,我有一个包tests.
我非常希望将模块命名tests为与它们包含测试的模块相同的名称,尽管它当然并不重要.
所以,在tests.foo我天真地写import foo.这不是很好 - 它是进口tests.foo,而不是顶级foo.
我能做我想做的事情,还是只需要打电话给测试模块test_foo?
对不起,如果这是显而易见的或是一个骗局,我的搜索失败了.
我正在使用抽象类std :: ostream.有以下参考:
std::ostream &o = std::cout;
Run Code Online (Sandbox Code Playgroud)
如果满足任何条件,我需要初始化o,以便输出重定向到std :: cout.如果没有,输出将被重定向到文件
if (!condition)
o = file; //Not possible
Run Code Online (Sandbox Code Playgroud)
如何正确编写代码?
设f(k)= y其中k是非负整数递增序列中的第y个数,其二进制表示中的数量为1,与k相同,例如f(0)= 1,f(1)= 1,f(2)= 2,f(3)= 1,f(4)= 3,f(5)= 2,f(6)= 3,依此类推.给定k> = 0,计算f(k)
我们很多人都看过这个问题
1这个问题的解决方案是根据1的数量对数字进行分类,然后找到rank.i确实找到了一些模式,但这将是一个漫长的过程.谁能建议我一个更好的解决方案?
我的Python 2.6代码中出现以下内容:
for src, dst in ([s,d] for s in universe for d in universe if s != d):
Run Code Online (Sandbox Code Playgroud)
我可以做得更好吗?我特别不喜欢的是,我实际上指定了两次相同的对,一次用于for循环,另一次用于生成器表达式.我不确定我是否愿意:
for src, dst in itertools.product(universe, universe):
if src != dst:
Run Code Online (Sandbox Code Playgroud)
有没有办法简洁地表达这个循环?
universe恰好是一个列表,如果它有任何区别.迭代次序无关紧要.
我的代码如下:
#include <cmath>
#include <iostream>
float foo(float f) {
std::cout << "float\n";
return f;
}
double foo(double d) {
std::cout << "double\n";
return d;
}
int main() {
int i = 16;
// foo(i); // ambiguous call, of course
return (int) std::sqrt(i);
}
Run Code Online (Sandbox Code Playgroud)
即使使用了最后一行中的调用,也没有报告含糊不清-pedantic -std=c++98 -Wall -Wextra,但它在其他编译器中根本不一定有效,因为同样的原因foo(i)没有.
gcc将以下内容添加到命名空间std:
template<typename _Tp>
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
double>::__type
sqrt(_Tp __x)
{ return __builtin_sqrt(__x); }
Run Code Online (Sandbox Code Playgroud)
也就是说,它inline double sqrt(X)为所有整数类型X 添加.
我很欣赏g ++尽力帮助我和所有人,但是有没有(合法的)方法让它诊断我的代码中的错误?
[编辑:我正在使用gcc 4.3.4,但如果其他版本的gcc可以诊断它,那么我也对这个事实感兴趣!]
我怀疑一些ASSERTION代码有副作用.我想关闭ASSERT,而不对我的代码编译方式进行任何其他更改.我正在使用MSVS2008.从调试切换到发布不会这样做会改变内存的初始化方式.
我有以下代码段:
typedef char OR[12];
class COR
{
OR m_or;
public:
COR(const char* or) { strcpy(m_or, or); }
COR(const COR& o) { strcpy(m_or, o.m_or); }
const char* GetOR() const { return m_or; }
#if 0 // I do not wish to use this as it will create a temporary object
bool operator<(const COR& left, const COR& right) const
{ return (strcmp(left.m_or, right.m_or) < 0); }
#endif
};
namespace std {
template<>
struct less<COR> {
bool operator()(const COR& cor, const char* or) …Run Code Online (Sandbox Code Playgroud)