C++ Vector string for-loop push_back error

C++ Vector string for-loop push_back error

本文关键字:back error push for-loop Vector string C++      更新时间:2023-10-16

我觉得这是一件很容易的事,但由于某种原因,我不明白发生了什么。

当我运行这部分代码时,这是将URL与数组中的字符串元素相结合,然后将其推入字符串向量,它成功地推第一个URL,但之后有某种内存泄漏?控制台无限循环胡言乱语…

string anonlist[] = {"test1","test2","test3","test4","test5","test6","test7"};

for (int i=0; i<=7; i++)
{
    vector<string> nameurl; 
    nameurl.push_back("http://api.twitter.com/1/users/show.json?screen_name="+anonlist[i]);
    cout << nameurl[i] << endl;
}

在索引为0 1 2 3 4 5 6的数组中有7项。你的循环还将包括i = 7超出数组边界的情况。

另一个问题是在循环内部声明vector,这意味着每次循环继续时都会创建一个新的vector。你应该在循环之前声明它。

string anonlist[] = {"test1","test2","test3","test4","test5","test6","test7"};
vector<string> nameurl; 
for (int i=0; i < 7; i++)
{
    nameurl.push_back("http://api.twitter.com/1/users/show.json?screen_name="+anonlist[i]);
    cout << nameurl[i] << endl;
}

每次通过循环创建一个新的vector<string>,插入一个元素,然后尝试访问索引i处的元素。当i0时,第一次通过循环时索引i处只有一个元素。

假设您想将nameurl的声明移出循环,以便在循环的所有迭代中使用相同的容器

每次通过for循环都创建一个新的vector——这个vector只在for循环中具有块作用域。你应该把vector移出循环。

另一种方法来做Ben的答案:

const string anonlist[] = {"test1", "test2", "test3", "test4", "test5", "test6", "test7"};
vector<string> nameurl(sizeof(anonlist) / sizeof(anonlist[0]), "http://api.twitter.com/1/users/show.json?screen_name="); 
for (size_t i = 0; i < nameurl.size(); ++i) {
    cout << (nameurl[i] += anonlist[i]) << endl;
}
这样,您就可以编辑anonlist,而不需要修改其余的代码。它构造了一个向量,所有元素都设置为基本URI,这很好。
相关文章: