C++ 在C+中移动向量的值+;

C++ 在C+中移动向量的值+;,c++,stdvector,C++,Stdvector,假设以下基本向量: std::vector<int> numbers; numbers.push_back(0); numbers.push_back(1); numbers.push_back(2); numbers.push_back(3); 移位后的向量: 0 1 2 3 0 X X X X X X 1 2 3 类似的内容将在数字的开头插入6: numbers.insert(numbers.begin(), 6); 如果要在数字1后插入数字6: numbers

假设以下基本向量:

 std::vector<int> numbers;
 numbers.push_back(0);
 numbers.push_back(1);
 numbers.push_back(2);
 numbers.push_back(3);
移位后的向量:

0 1 2 3
0 X X X X X X 1 2 3

类似的内容将在数字的开头插入
6

numbers.insert(numbers.begin(), 6);
如果要在数字1后插入数字6:

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

(显然,如果您不确定该数字是否在列表中,您可能需要在插入之前检查!)

类似的内容将在
数字的开头插入
6

numbers.insert(numbers.begin(), 6);
如果要在数字1后插入数字6:

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

(显然,如果您不确定该数字是否在列表中,您可能需要在插入之前检查!)

存在允许您插入相同项目的函数重载:

// Add six copies of -1 to the vector starting at position 1
numbers.insert(numbers.begin()+1, 6, -1);
您可以使用另一个重载,该重载接受三个迭代器—插入的迭代器和从中获取数据的开始/结束迭代器对:

// Insert addedNUmbers at position 1
numbers.insert(numbers.begin()+1, addedNUmbers.begin(), addedNUmbers.end());

函数有一个重载,允许您插入相同的项:

// Add six copies of -1 to the vector starting at position 1
numbers.insert(numbers.begin()+1, 6, -1);
您可以使用另一个重载,该重载接受三个迭代器—插入的迭代器和从中获取数据的开始/结束迭代器对:

// Insert addedNUmbers at position 1
numbers.insert(numbers.begin()+1, addedNUmbers.begin(), addedNUmbers.end());

如果必须从不同的来源逐个插入项目,因此无法使用范围插入,一个选项是在后面插入所有内容,然后使用:

#包括
v、 储备(v.大小()+6);
v、 推回(12);
v、 向后推(foo());
// ...
旋转(v.begin()+1,v.begin()+4,v.end());

如果您必须从不同来源逐个插入项目,因此无法使用范围插入,一个选项是在后面插入所有内容,然后使用:

#包括
v、 储备(v.大小()+6);
v、 推回(12);
v、 向后推(foo());
// ...
旋转(v.begin()+1,v.begin()+4,v.end());


我认为我们真的需要更多地了解这个问题才能有所帮助,插入向量的中间永远都不好,尽量避免it@aaronman我需要一个向量,因为我正在使用的API的数据必须对齐。如果不能像Dasblightlink的回答那样插入连续的范围,可以在末尾使用insert,然后使用
std::rotate
。@DavidRodríguez dribeas:我更喜欢C++11三迭代器插入:-)@DavidRodríguez dribeas:我只是在鹦鹉学舌。午夜过后,我不再检查180k+人说的话。。。(但好吧,我会写一个答案!)我想我们真的需要更多地了解这个问题才能有所帮助,插入向量的中间永远都不好,尽量避免it@aaronman我需要一个向量,因为我正在使用的API的数据必须对齐。如果不能像Dasblightlink的回答那样插入连续的范围,可以在末尾使用insert,然后使用
std::rotate
。@DavidRodríguez dribeas:我更喜欢C++11三迭代器插入:-)@DavidRodríguez dribeas:我只是在鹦鹉学舌。午夜过后,我不再检查180k+人说的话。。。(但好吧,我会写一个答案!)@DavidRodríguez dribeas Oops,谢谢你指出这一点!我不知道为什么我认为它直到C++11才被添加,尽管我发布的链接上写着“在C++11之前”。谢谢你能插入一个大括号的列表吗@达斯宾莱特:万岁。因为在这种情况下,即使有不同的源代码,我还是更喜欢插入(v.begin()+1,{12,foo(),priced()})
:-)@DavidRodríguez dribeas-Oops,谢谢你指出这一点!我不知道为什么我认为它直到C++11才被添加,尽管我发布的链接上写着“在C++11之前”。谢谢你能插入一个大括号的列表吗@达斯宾莱特:万岁。因为在这种情况下,即使使用不同的源,我也更喜欢
insert(v.begin()+1,{12,foo(),pricine()})
:-)我也可以使用
std::move
吗?@Grapes:用于整数?为什么?如果它们不是整数?@Grapes:那么问题是什么
push_back
采用l值和右值引用,因此您可以在其中移动。我的示例只使用右值,因此这意味着……我可以将索引1-3,6个位置移到右边吗?然后编辑空点?我也可以使用
std::move
吗?@Grapes:用于整数?为什么?如果它们不是整数?@Grapes:那么问题是什么
push_back
采用l值和右值引用,因此您可以在其中移动。我的示例只使用右值,因此这意味着……我可以将索引1-3,6个位置移到右边吗?然后编辑空白点?