所以这对我自己的知识来说更是一个问题。 是否有任何最佳实践可以访问向量中单个元素的多个属性?对不起,如果这个问题没有多大意义。让我给出一个场景:
我正在研究一些代码,并且我创建了一个结构向量。为了确保我们不复制向量中的数据,我们通过for循环检查传输数据的多个部分与向量中已有的数据。数据是从多个独立的源添加的,有时是快速连续的,因此在此之前为每个条目执行主ID有点困难。代码最终看起来像这样:
vector<testStruct> test;
void addDataToVector(int _iData1, string _sData2, unsigned int _uiData3){
testStruct tmp;
tmp.iData1 = _iData1;
tmp.sData2 = _sData2;
tmp.uiData3 = _uiData3;
if(test.size() > 0){
for(size_t i = 0;; i < test.size(); i++){
if(test[i].iData1 == tmp.iData1 &&
test[i].sData2 == tmp.sData2 &&
test[i].uiData3 == tmp.uiData3){
break;
}else{
test.push_back(tmp);
}
}
}else{
test.push_back(tmp);
}
}
在其他一些编程语言中,我已经了解到对这样的数组的同一元素进行多次调用有点浪费。在Action Script 3中,我了解到最好将元素的内容分配给临时变量,然后将该变量用于多个调用,而不是不断地反复访问向量。 我想知道在c ++中是否有任何此类事情需要警惕?我知道矢量是一个指针......我想。但是我不确定这是否会减轻很多这个问题,或者我是否还需要继续关注这样的事情。我一直在寻找类似的数据/答案,但不确定如何说出我的搜索。
任何帮助或指示(嘿嘿得到它?)将不胜感激。
答案 0 :(得分:1)
不仅向量是指针(更像是数组的包装器),而且它也是一个模板,这意味着编译器在使用它时通常可以访问它的整个实现。这意味着编译器确切知道究竟是什么test[i]
,并且可以为您优化这些东西。你不必关心这些事情。对于向量,元素访问非常。
您可能希望为您的结构重载operator==
,因此您可以改为编写test[i] == tmp
。这样可以提高代码的可读性,但是如果字段相等实际上意味着对象是相等的,也就是说,如果这有意义语义,那么你应该这样做。
或者,如果在某些时候你只是因为某些其他原因而不是性能(例如,访问表达式太长而无法轻松重复)而只想访问一个元素,那么您可以轻松地执行此操作:
const testStruct &element = test[i];
注意&
- 您可以避免以这种方式复制的不必要成本,并直接访问vector元素。如果您需要修改元素,请删除const
。
答案 1 :(得分:1)
如果订单不重要,最好使用set
代替vector
。 Set用于存储一组唯一项。当您将一个项目添加到一个集合时,计算机将检查它是否已经存在。如果不是,则该项目将添加到集合中。它会更快地工作,即一次添加将采用O(log N)而不是O(N)时间。
此外,它还允许您检查元素是否存在于集合中,或者是否按O(log N)时间删除元素。
功能将如下所示:
set<testStruct> test;
void add(int _iData1, string _sData2, unsigned int _uiData3) {
testStruct tmp;
tmp.iData1 = _iData1;
tmp.sData2 = _sData2;
tmp.uiData3 = _uiData3;
test.insert(tmp);
}
或者您只能写
test.emplace(i, s, ui);
插入没有任何附加功能的项目。
答案 2 :(得分:0)
是否真的有必要将函数的第一行中的数据复制到测试结构中?我会直接将传递的参数与数组值进行比较,并在推回之前构造结构。
你好像不使用构造函数 - 为什么?
关于快速传入数据流的问题 - 请描述整个系统的拓扑结构。也许中央队列组件或类似的东西可能有帮助吗?
答案 3 :(得分:-3)
testStruct
仅包含字段iData1
,sData2
和uiData3
吗?如果是,您可以简单地比较test[i] == tmp
等对象。
此外,如果元素的顺序不重要,您可以更轻松地解决问题,同时更有效。在这种情况下,请使用set
代替vector
。