小编Ste*_*sop的帖子

是否允许std :: vector :: push_back因重新分配或构造失败以外的任何原因而抛出?

考虑:

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.

这个问题适用于尽可能多insertpush_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,所以这个建议可能不好.]

c++ standards-compliance

11
推荐指数
1
解决办法
2619
查看次数

gcc中的划分优化

这是一些代码(完整程序后面的问题):

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)

c++ optimization gcc

9
推荐指数
1
解决办法
2513
查看次数

如何导入名称与包中的模块冲突的模块?

我在一个目录中有几个python模块.

在同一目录中,我有一个包tests.

我非常希望将模块命名tests为与它们包含测试的模块相同的名称,尽管它当然并不重要.

所以,在tests.foo我天真地写import foo.这不是很好 - 它是进口tests.foo,而不是顶级foo.

我能做我想做的事情,还是只需要打电话给测试模块test_foo

对不起,如果这是显而易见的或是一个骗局,我的搜索失败了.

python import

9
推荐指数
1
解决办法
4221
查看次数

为什么分配给std :: ostream的引用无法编译?

我正在使用抽象类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)

如何正确编写代码?

c++ ostream

9
推荐指数
2
解决办法
926
查看次数

根据1的数量查找数字的等级

设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确实找到了一些模式,但这将是一个漫长的过程.谁能建议我一个更好的解决方案?

c c++ algorithm

9
推荐指数
1
解决办法
646
查看次数

生成器表达式与for循环的丑陋组合

我的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恰好是一个列表,如果它有任何区别.迭代次序无关紧要.

python for-loop generator

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

如何在g ++ 4.3.4中诊断对sqrt(int&)的模糊调用

我的代码如下:

#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可以诊断它,那么我也对这个事实感兴趣!]

c++ gcc overloading sqrt

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

C中的空结构与C++中的空结构

为什么C中的空结构违反约束?为什么在C++中更改此规则?

有历史原因吗?

c c++ struct rationale

7
推荐指数
1
解决办法
2003
查看次数

如何在C++中关闭ASSERT(x)?

我怀疑一些ASSERTION代码有副作用.我想关闭ASSERT,而不对我的代码编译方式进行任何其他更改.我正在使用MSVS2008.从调试切换到发布不会这样做会改变内存的初始化方式.

c++ assertions visual-studio

6
推荐指数
2
解决办法
5941
查看次数

如何使用重载的std :: less for std :: map

我有以下代码段:

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)

c++ stl

6
推荐指数
1
解决办法
9087
查看次数