小编Joh*_* H.的帖子

vector::resize 增加了多少容量?

据我所知,C++ 标准没有具体说明当 vector::resize 需要增加时如何增加向量容量。但有没有一个“典型”的实现呢?

具体来说:我不知道我的向量需要有多大。此外,元素的顺序是随机的。所以对于每个元素我都有这个:

if ( index >= vector.size() ) {
    vector.resize ( index + 1 );
}
vector.at ( index ) = element;
Run Code Online (Sandbox Code Playgroud)

如果元素按递增的索引顺序排列,每次调用调整大小时向量容量是否会增加一(在典型的实现中)?我希望不会...

c++ resize capacity stdvector

5
推荐指数
1
解决办法
6257
查看次数

在 gdb 中调用 std::~basic_string()

根据/sf/answers/791825051/中的@EvanED ,我创建了一个 gdb 命令newstr来创建一个新的 std::string 并将其放入 gdb 便利变量中:

define newstr
set ($arg0)=(std::string*)malloc(sizeof(std::string))
call ($arg0)->basic_string()
# 'assign' returns *this; casting return to void avoids printing of the struct.
call (void)( ($arg0)->assign($arg1) )
end
Run Code Online (Sandbox Code Playgroud)

效果很好:

(gdb) newstr $foo "hello world"
(gdb) p $foo->c_str()
$57 = 0xb22e388 "hello world"
Run Code Online (Sandbox Code Playgroud)

newstr在其他自定义 gdb 命令中使用,因此为了整洁我还创建了delstr

define delstr
call ($arg0)->~basic_string($arg0)
call free($arg0)
set ($arg0)=(void*)0
end
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是析构函数调用会产生一条恼人的消息:

(gdb) delstr $foo
warning: Using non-standard conversion to match method std::string::~basic_string to supplied …
Run Code Online (Sandbox Code Playgroud)

gdb destructor type-conversion stdstring c++11

3
推荐指数
1
解决办法
934
查看次数

C++中向量初始化的性能

假设您从另一个容器初始化一个向量:

main()
{
    list<int> L { 0, 1, 2 };
    vector<int> V ( L.begin(), L.end() );
    copy ( V.begin(), V.end(), ostream_iterator<int> ( cout, " " ) );
    cout << endl;
}
Run Code Online (Sandbox Code Playgroud)

矢量大小是设置一次,还是在初始化期间动态调整大小?(在此示例中不是问题,因为源代码很少,但如果源包含很多元素,则可能会出现问题.)

c++ performance initialization vector

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

如何使用static_assert检查模板化函数的迭代器参数的元素类型?

我有一个带有输出迭代器参数的函数的模板.我如何使用static_assert来检查实例化是否使用了适当的迭代器?(即,它都是输出迭代器,并且它分配了正确类型的元素.)

#include <iostream>
#include <list>
#include <set>

template <class OutputIter>
void add_ints ( OutputIter iter )
{
    static_assert ( something_goes_here,
                    "Arg must be an output iterator over ints" );

    *iter++ = 1;
    *iter++ = 2;
    *iter++ = 3;
}

main()
{
    // Insert iterator will add three elements.
    std::set<int> my_set;
    add_ints ( std::inserter ( my_set, my_set.end() ) );
    for ( int i : my_set ) std::cout << i << "\n";

    // Non-insert iterator will overwrite three elements.
    std::list<int> …
Run Code Online (Sandbox Code Playgroud)

c++ templates iterator static-assert type-traits

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