如果从已经排序的文件中读取项目,是否需要对矢量进行排序?如果不必要,我不想承担性能损失。作为参考,我正在使用它来构建它,并且每个项目都在按顺序读取。
在@ 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;
}
答案 0 :(得分:5)
不,您不需要对矢量进行排序。 push_back
明确地将元素添加到结尾。
请注意,您的API正在接收elems
并返回它(通过引用)。矢量已包含的任何内容会发生什么?
答案 1 :(得分:4)
如果您询问std::vector
是否会保留将项目推送到其上的顺序,那么是。这是合同的一部分。
答案 2 :(得分:3)
如果启动时矢量为空(原始示例代码中不清楚),并且按照您想要的顺序添加了项目,不,您不需要排序,因为{ {3}}将项目推送到向量的后面(结束):
在向量的末尾添加一个新元素,在其当前的最后一个元素之后。
在编辑之后,列表非空开始的可能性现在已经消失。这部分仍然代表原始问题,这是可能的。
如果矢量开头并非空,那么即使您按顺序添加了新内容,其中的内容也可能会出现故障。
如果你想确保它的排序,但是除非绝对必要,否则你可以避免排序,你可以在添加之后作为后续步骤进行排序,例如:
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;
}
在这种情况下,每个元素都会与最后一个元素进行核对,以确保它至少同样大。如果没有,则标记向量以进行排序。
通过这种方式,检查成本最低,但它使您能够处理不符合规则的数据。