1

次の基本ベクトルを仮定します。

 std::vector<int> numbers;
 numbers.push_back(0);
 numbers.push_back(1);
 numbers.push_back(2);
 numbers.push_back(3);

0 と 1 の間に 6 つの新しい数字を挿入する効率的な方法は何ですか?

これが現在の私のアプローチですが、あまり効率的ではないように感じます。

 for (int new_number=0;new_number<6;new_number++) {
     numbers.emplace(numbers.begin()+1+new_number,new_number);
 }

このアプローチが気に入らない理由は、1 ~ 3 の数字を 6 回移動する必要があるためです。これらの数字を 6 回ではなく 1 回だけ移動する方法はありますか? 次に、このループを使用できます。

 for (int new_number=0;new_number<6;new_number++) {
     numbers[new_number+1]=new_number;
 }

これが私が達成しようとしていることです:

シフト前のベクトル:

0 1 2 3

シフト後のベクトル:

0 X X X X X X 1 2 3
4

3 に答える 3

7

同一の項目insertを挿入できる関数のオーバーロードがあります。n

// Add six copies of -1 to the vector starting at position 1
numbers.insert(numbers.begin()+1, 6, -1);

3 つのイテレータ (挿入するイテレータと、データを取得するイテレータの開始/終了ペア) を取る別のオーバーロードを使用できます。

// Insert addedNUmbers at position 1
numbers.insert(numbers.begin()+1, addedNUmbers.begin(), addedNUmbers.end());
于 2013-10-02T20:55:30.737 に答える
3

異なるソースからアイテムを1つずつ挿入する必要があるため、範囲挿入を使用できない場合、1つのオプションは、すべてを後ろに挿入してから使用することstd::rotateです:

#include <algorithm>

v.reserve(v.size() + 6);

v.push_back(12);
v.push_back(foo());
// ...

std::rotate(v.begin() + 1, v.begin() + 4, v.end());
于 2013-10-02T21:08:47.780 に答える
0

6このようなものがの先頭に挿入されnumbersます:

numbers.insert(numbers.begin(), 6);

数字の 1 の後に数字の 6 を挿入する場合:

numbers.insert(find(numbers.begin(), numbers.end(), 1), 6);

(明らかに、番号がリストにあることを確実に知らない場合は、挿入する前に確認することをお勧めします!)

于 2013-10-02T20:55:22.300 に答える