据我所知,C++ 标准没有具体说明当 vector::resize 需要增加时如何增加向量容量。但有没有一个“典型”的实现呢?
具体来说:我不知道我的向量需要有多大。此外,元素的顺序是随机的。所以对于每个元素我都有这个:
if ( index >= vector.size() ) {
vector.resize ( index + 1 );
}
vector.at ( index ) = element;
Run Code Online (Sandbox Code Playgroud)
如果元素按递增的索引顺序排列,每次调用调整大小时向量容量是否会增加一(在典型的实现中)?我希望不会...
根据/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) 假设您从另一个容器初始化一个向量:
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)
矢量大小是设置一次,还是在初始化期间动态调整大小?(在此示例中不是问题,因为源代码很少,但如果源包含很多元素,则可能会出现问题.)
我有一个带有输出迭代器参数的函数的模板.我如何使用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++ ×3
c++11 ×1
capacity ×1
destructor ×1
gdb ×1
iterator ×1
performance ×1
resize ×1
stdstring ×1
stdvector ×1
templates ×1
type-traits ×1
vector ×1