【发布时间】:2019-06-08 00:07:11
【问题描述】:
总结:
似乎只是在向量上调用clear() 不足以清除它。
vector_full_of_stuff.clear();
我必须先调用clear(),然后再调用shrink_to_fit() 才能完全删除其中的所有数据。
vector_full_of_stuff.clear();
// AND THEN
vector_full_of_stuff.shrink_to_fit();
什么给了?这成为了一个问题,因为当我在向量上调用 data() 时,它会包含我认为应该在我之前在代码中调用 clear() 时清除的内容。
其他详情:
我正在执行计算机网络任务,我必须将 PASV 命令结果解析为 IP 和端口号。在解析以逗号分隔的虚构 PASV 命令结果时,我注意到如果我解析一个三位数字,然后解析一个两位数字,我会在调用 data() 时从前一个解析中得到第三位数字,即使我不应该(?)因为我在它之前调用clear()。
例如
PASV 命令结果 = 209,202,252,54,19,15
“252”中的“2”在解析时会延续到“19”中。
代码:
// this one actually deletes data
void splitString(string str, char delimiter, vector<string> * out) {
vector<char> word_buffer;
for (int i = 0; i < str.length(); ++i) {
if (str[i] == delimiter) {
out->push_back(word_buffer.data());
word_buffer.clear();
word_buffer.shrink_to_fit();
} else {
word_buffer.push_back(str[i]);
}
}
out->push_back(word_buffer.data());
word_buffer.clear();
}
//
// this one doesn't
// the only thing that's different about this one
// is that its missing shrink_to_fit()
void splitString(string str, char delimiter, vector<string> * out) {
vector<char> word_buffer;
for (int i = 0; i < str.length(); ++i) {
if (str[i] == delimiter) {
out->push_back(word_buffer.data());
word_buffer.clear();
// word_buffer.shrink_to_fit(); // need this to delete data
} else {
word_buffer.push_back(str[i]);
}
}
out->push_back(word_buffer.data());
word_buffer.clear();
}
//
// main driver code
int main() {
vector<string> user_input_tokens;
string port = "209,202,252,54,19,15";
splitString(port, ',', &user_input_tokens);
for (string str : user_input_tokens) {
cout << str << ".";
}
}
//
预期输出:
209.202.252.54.19.15.
实际输出:
209.202.252.542.192.152.
【问题讨论】:
标签: c++ vector stl erase shrink