我正在寻找类似于在Python中遍历字符串的东西:
即
for char in str:
do something
Run Code Online (Sandbox Code Playgroud)
我怎么能用C++做到这一点?
谢谢
在 C++ 中,auto关键字强制编译器在编译时推断变量的类型。所以在这个例子中
#include <vector>
int main()
{
std::vector<int> my_vec = {1, 2, 3};
auto my_vec_it = my_vec.begin();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器会推断出my_vec_it具有 type std::vector<int>::iterator。我知道这是因为更换auto用std::vector<int>::iterator和重新编译产生完全相同的可执行文件。
我发现auto在编译器不同意我认为变量声明应该是什么的情况下很方便,我只是希望它停止抱怨以便我可以继续写作。换句话说,auto当我不太了解我正在编写的代码时,我会使用它,这似乎是一个坏习惯。如果编译器和我在变量的类型上存在分歧,这种分歧可能会渗透并在我的代码中进一步导致更复杂、根深蒂固的错误。这让我想知道auto真正的用途是什么。
auto我上面描述的使用是一种不好的编程习惯,如果是的话,它的一些更原则性的用途是什么?
我自己正在学习 Delphi。我已经看到了auto可以在 C++ 中发挥某种程度的魔力的变量类型。Delphi 中是否有auto变量类型或类似的东西?
我似乎无法看到我在这里做错了什么,并且稍微离开了我的深度.
我所拥有的是一些包含向量和多图的数据结构.
我想制作包含原始数据指针的第二个矢量/多图,这样如果我编辑第二个矢量/地图,数据就会在原始数据中发生变化.原因是该列表是基于某些标准的orig的临时子集.
首先我在矢量上尝试了它,它似乎工作,这是一个工作的例子:
std::vector<std::string> strVect;
strVect.push_back("test1");
strVect.push_back("test2");
strVect.push_back("test3");
std::vector<std::string *>strpVect;
for (std::string &str : strVect)
{
strpVect.push_back(&str);
}
Run Code Online (Sandbox Code Playgroud)
这里,strpVect中的元素指向strVect中的原始元素.
现在我想为multimaps做同样的事情:
std::multimap<int, std::string> strMap;
strMap.insert(std::pair<int, std::string>(1, "test1"));
strMap.insert(std::pair<int, std::string>(2, "test2"));
strMap.insert(std::pair<int, std::string>(3, "test3"));
std::multimap<int, std::string *>strpMap;
for (std::pair<int, std::string> &val : strMap) // <<<<< error here
{
strpMap.insert(std::pair<int, std::string *>(val.first, &val.second));
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行这个时,我得到了错误 invalid init of non-const reference of type std::pair....
如果我使它成为一个const然后它的工作原理:
std::multimap<int, std::string> strMap;
strMap.insert(std::pair<int, std::string>(1, "test1"));
strMap.insert(std::pair<int, std::string>(2, "test2"));
strMap.insert(std::pair<int, std::string>(3, "test3"));
std::multimap<int, std::string *>strpMap;
for (const std::pair<int, …Run Code Online (Sandbox Code Playgroud)