2

1つまたは複数の要素のサイズが変更されると、ベクトルはどうなりますか?

詳述すると、

#include <string>
#include <vector>
using namespace std;
int main() {
    vector<string> v;
    v.push_back("first string");
    v.push_back("2nd string");
    v[0] += " has increased in size";
}

「v[0]+ = ...」で何が起こる可能性がありますか?文字列とベクトルの両方でメモリを連続させておくために、大量の再割り当てがありますか?

4

4 に答える 4

6

にはメモリの再割り当てはなく、標準ではそれについて何も述べられていませんが、vectorほぼ確実にの再割り当てがあります。string文字列は、文字列オブジェクト自体とは別にコンテンツを保持するという点でベクトルに似ています。

于 2012-09-11T04:05:15.113 に答える
5

いいえstring。実際の文字列データを個別に割り当てられたメモリに格納します(モジュロショート文字列最適化)。オブジェクトの実際のサイズは変更できず、コンパイル時に固定されます。このような動的なサイズ設定は、個別に割り当てられたメモリまたはオブジェクトの階層を使用して実行されます(たとえば、set / mapはノードのツリーを使用し、listはノードの二重リンクリストを使用します)。

于 2012-09-11T04:04:47.560 に答える
1

文字列とベクトルの両方でメモリを連続させておくために、大量の再割り当てがありますか?

ベクトルの要素は連続していますが、含まれている各文字列内に、テキストコンテンツが格納されている動的に割り当てられたストレージへのポインタがあります(文字列が空ではなく、固定サイズの内部バッファに収まるほど短いと仮定します-既知の手法実装が使用する必要があるかもしれないが必須ではない「短い文字列の最適化」として)。

charここで、ベクトルと文字列の両方について、現在のサイズ(要素数/データ用)と容量(既に予約されており、コンテナーが割り当てなくても成長できるヒープの量)の違いを理解することが重要です。ヒープの新しい領域と要素を移動します。

したがって、既存の容量が十分である場合、文字列の連結が適切に行われます。容量を増やす必要がある場合は、動的メモリへのその1つの文字列のポインタが更新され、テキストコンテンツがコピーされる、新しく割り当てられたより大きなヒープ領域がアドレス指定され、元のヒープ領域が解放されます。

操作によってベクトルが再割り当てされるpush_back()可能性がありますが、文字列オブジェクトはヒープメモリの個別のブロックを「所有」します。

特定の実装が何をしているのか知りたい場合は、コンテナの操作の前後と、最初の要素のアドレスを印刷できます。size()それでもcapacity()、容量がサイズを超える量は、再割り当ては標準で指定されていないため、コンパイラのフラグ/バージョン、OSなどで変更される可能性もあります。

概略的には、次のようなものです。

VECTOR:                /-------->[first string's text]...extra capacity...
[ first string object /]
[    second string object   \]
...extra vector capacity...  \-->[second string's text]...extra capacity...
于 2012-09-11T04:38:13.220 に答える
0

オブジェクトはstring固定サイズです。含まれている文字列が、文字列の実装によって提供される内部ストレージ (存在する場合) に収まらない場合は、個別に割り当てられます。少なくとも意図的にではなく、他の文字列ストレージと連続していません。

于 2012-09-11T04:30:42.173 に答える