如果向量<int>按顺序添加到向量中,我是否需要对向量进行排序?
Do I need to sort a vector<int> if they were added to the vector in order?
如果项目是从已经排序的文件中按顺序读取的,我是否需要对向量进行排序?如果没有必要的话,我不想招致绩效罚款。作为参考,这是我用来构建它的东西,每个项目都是按顺序读取的
根据@dribeas的评论编辑
std::vector<int> split(const std::string &s, char delim) {
std::vector<int> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(static_cast<int>(atoi(item.c_str())));
}
return elems;
}
不,您不需要对向量进行排序。push_back
显式地将元素添加到末尾。
请注意,您的API正在接收elems
并返回它(通过引用)。向量已经包含的任何内容会发生什么?
如果您询问std::vector
是否会保留将项目推送到其上的顺序,那么是的。这在很大程度上是合同的一部分。
如果开始时向量为空(这在原始示例代码中不清楚),并且项目是按您想要的顺序添加的,不,您不需要排序,因为push_back
将项目推送到向量的后:
在矢量的末尾,在当前最后一个元素之后添加一个新元素。
编辑后,列表一开始不为空的可能性现在已经消失。这一部分仍然支持最初的问题,即在哪里有这种可能性。
如果向量一开始不是空的,那么即使你按顺序添加了新的东西,里面的东西也可能会乱序。
如果你想确保它被排序,但除非绝对必要,否则避免排序,你可以在添加后的一个后步骤中这样做,比如:
std::vector<int> &split (const std::string &s, char sep, std::vector<int> &vec)
{
std::stringstream ss (s);
std::string item;
while (std::getline (ss, item, sep))
vec.push_back (static_cast<int> (atoi (item.c_str ())));
bool sorted = true;
for (int i = vec.size() - 1; (i > 0) && sorted; i--)
sorted = (vec[i] >= vec[i-1]);
if (!sorted) {
// Sort it here.
}
return vec;
}
这将是对元素的相对快速的扫描,以确定它们是否已排序(并且仅在找到第一个无序组之前)。
如果没有排序,它将使用您最喜欢的排序算法(不包括电池)对它们进行排序,否则它将返回。
然而,最好假设数据可能没有按照您想要的顺序到达。你仍然可以使用类似的方法,只在必要时进行排序,比如:
std::vector<int> split (const std::string &s, char delim) {
std::vector<int> elems;
std::stringstream ss (s);
std::string item;
int lastOne = std::numeric_limits<int>::min ();
bool isSorted = true;
while (std::getline(ss, item, delim)) {
int thisOne = atoi (item.c_str ());
if (thisOne < lastOne) isSorted = false;
elems.push_back (static_cast<int> (thisOne));
lastOne = thisOne;
}
if (!isSorted) {
// Sort it here.
}
return elems;
}
在这种情况下,每个元素都会根据最后一个元素进行检查,以确保它至少同样大。如果没有,则标记向量进行排序。
这样一来,检查成本最低,但它使您能够处理不符合规则的数据。
相关文章:
- 检查向量是否具有所有可能的字符组合
- 向量是否存在行主要形式?
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 检查两个向量是否并行的最有效方法
- 对象向量是否在堆或堆栈上分配C++?
- 检查向量是否使用除法和阻抗算法进行排序
- 包含字符串的结构的 Boost 进程间向量是否需要特殊的分配器?
- 使用 stl 迭代器封装向量是否很好?如果是?怎么可能呢?
- 检查给定向量是否已经包含 C++ 中的 pair 元素
- 检查向量是否在某个位置未初始化
- 在此示例中,向量是否复制了两次
- 如何检查向量是否包含指定索引中的特定字符
- 向量是否在push_back()上重新创建所有对象
- 向量是否知道在由一对迭代器初始化时首先保留?
- 检查字符串向量是否是其中一个元素中的子字符串
- 检查布尔(范围)的向量是否等于1和0的序列
- 快速紧凑的方式来检查向量是否是二进制的
- C++检查向量a是否包括向量b的元素
- 预分配向量是否更有效
- 确定两个向量是否包含两个相同的相邻项