如何将一个向量传递给另一个向量推回?(无需创建要传递的额外变量)
How to pass a vector to another vector push back? (without creating a extra variable to pass)
好吧,我在问自己是否有办法直接在参数中传递向量,我的意思是,像这样:
int xPOS = 5, yPOS = 6, zPOS = 2;
//^this is actually a struct but
//I simplified the code to this
std::vector <std::vector<int>> NodePoints;
NodePoints.push_back(
std::vector<int> {xPOS,yPOS,zPOS}
);
这段代码当然会给出一个错误;不允许使用类型名,并且需要")"
我会使用结构体,但我必须将数据传递给抽象虚拟机,我需要在其中访问节点位置,如下所示Array[index][index]
:
public GPS_WhenRouteIsCalculated(...)
{
for(new i = 0; i < amount_of_nodes; ++i)
{
printf("Point(%d)=NodeID(%d), Position(X;Y;Z):{%f;%f;%f}",i,node_id_array[i],NodePosition[i][0],NodePosition[i][1],NodePosition[i][2]);
}
return 1;
}
当然,我可以这样做:
std::vector <std::vector<int>> NodePoints;//global
std::vector<int> x;//local
x.push_back(xPOS);
x.push_back(yPOS);
x.push_back(zPOS);
NodePoints.push_back(x);
或者这个:
std::vector <std::vector<int>> NodePoints;//global
std::vector<int> x;//global
x.push_back(xPOS);
x.push_back(yPOS);
x.push_back(zPOS);
NodePoints.push_back(x);
x.clear()
但是我想知道两者中哪一个会更快/更高效/更好?或者有没有办法让我的初始代码工作(第一个片段)?
为此使用 C++11 或 boost 中的内容(您也可以使用简单的v.push_back({1,2,3})
,向量将从 initializer_list 构造)。
http://liveworkspace.org/code/m4kRJ$0
如果没有 C++11,您也可以使用 boost::assign 。
#include <vector>
#include <boost/assign/list_of.hpp>
using namespace boost::assign;
int main()
{
std::vector<std::vector<int>> v;
v.push_back(list_of(1)(2)(3));
}
http://liveworkspace.org/code/m4kRJ$5
当然,您可以使用旧变体
int ptr[1,2,3];
v.push_back(std::vector<int>(ptr, ptr + sizeof(ptr) / sizeof(*ptr));
Boost 或 C++11,那么您可以考虑一个基于类的非常简单的解决方案。通过使用一些简单的访问控制将向量包装以将三个点存储在类中,您可以创建所需的灵活性。首先创建类:
class NodePoint
{
public:
NodePoint( int a, int b, int c )
{
dim_.push_back( a );
dim_.push_back( b );
dim_.push_back( c );
}
int& operator[]( size_t i ){ return dim_[i]; }
private:
vector<int> dim_;
};
这里重要的是将向量封装为对象的聚合。NodePoint
只能通过提供三个点来初始化。我还提供了operator[]
,以允许对对象的索引访问。它可以按如下方式使用:
NodePoint a(5, 6, 2);
cout << a[0] << " " << a[1] << " " << a[2] << endl;
哪些打印:
5 6 2
请注意,如果尝试访问越界索引点,这当然会抛出,但这仍然比很可能出现 seg 错误的固定数组要好。我不认为这是一个完美的解决方案,但它应该让你合理安全地到达你想去的地方。
如果您的主要目标是避免不必要的vector<>
副本,那么在这里您应该如何处理它。
C++03
将空向量插入嵌套向量(例如 Nodepoints
),然后在其上使用std::swap()
或std::vector::swap()
。
NodePoints.push_back(std::vector<int>()); // add an empty vector
std::swap(x, NodePoints.back()); // swaps contents of `x` and last element of `NodePoints`
所以在swap()
之后,x
的内容将被转移到NodePoints.back()
,而无需任何复制。
C++11
使用std::move()
避免额外的副本
NodePoints.push_back(std::move(x)); // #include<utility>
这是std::move
的解释,下面是一个例子。
上述两种解决方案的效果有些相似。
- 从具有自定义排序的向量创建集合
- 我正在寻找一种优雅的方式来从元组向量创建tuple_element向量
- 从类指针的向量创建成员变量的向量
- 从 c++ 中的字符串向量创建一个元组
- 如何在 c++ 中从两个向量创建 JSON 对象?
- 如何在不迭代的情况下从string_view向量创建字符串向量?
- 通过移动从两个向量创建元组向量
- 为结构的向量创建C 矢量迭代器
- C 矢量元素擦除与新向量创建
- 使用向量的向量创建一个尺寸
- C MultiSet从排序的向量创建
- 从向量<T>创建一组字符串
- 使用C 中的向量创建整数集类别
- 从两个原始向量创建一个“特征::矩阵”
- 用向量创建筛子
- 从Vectores的向量创建一个板
- C++内存管理:从函数中的向量创建一个新数组
- 正在使用类中的向量创建类
- 为向量创建临时变量
- 如何在c++中使用模板图类中的向量创建邻接矩阵