我曾经在12年前使用C++编写代码,但由于我的工作原因,我把它留给了其他更简单的语言.
我想更新我的知识并尝试编译这里提出的解决方案,只是为了尝试这种迭代向量的新方法.但遇到编译错误:
expected initializer before ‘:’ token
我不知道有可能避免显式声明迭代器,就像C++使用它一样(auto && elem : v).C++它的版本是什么?
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#include <string>
#include <set>
int main()
{
std::vector<std::pair<std::string, std::string>> v
{ {"handgun", "bullets"},
{"turret", "bullets"}};
std::cout << "Initially: " << std::endl << std::endl;
for (auto && elem : v)
std::cout << elem.first << " " << elem.second << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
$ cc b.cpp -std=c++0x -o myprog
Run Code Online (Sandbox Code Playgroud)
b.cpp:在函数'int …
我测试了接口的方法next()和remove()方法Iterator.我得到以下异常:
线程"main"java.util.ConcurrentModificationException中的异常
这是我的代码:
import java.util.*;
public class ListTest {
public static void main(String[] args) {
Collection<Integer> list = new ArrayList<Integer>();
Iterator<Integer> iterator = list.iterator();
Collections.addAll(list, 1, 2, 3, 4, 5);
if (iterator.hasNext()) {
iterator.next();
iterator.remove();
}
System.out.println(list);
}
}
Run Code Online (Sandbox Code Playgroud) 目前正在使用我的DirectX游戏并在常量缓冲区构造函数中使用memset(0)(或VS中的ZeroMemory宏)来使用零初始化所有值,并且它可以正常工作.当我不小心尝试以这种方式初始化包含向量的其他结构时出现问题.根据编译器(VS2010/VS2012),这会导致"矢量迭代器不兼容",std :: vector :: end更加精确.我可以理解memset可能会使向量迭代器无效,但是在我将元素推回到向量之后,为什么"结束"迭代器无法正常工作.它不应该重新定位向量将迭代器结束到正确的位置(在最后一个元素之后)?所有类型的std :: some_container :: end迭代器都受此影响了吗?
#include <vector>
class MyClass
{
public:
MyClass() {
memset(this, 0, sizeof(*this));
}
~MyClass() {}
std::vector<int>& GetData() { return m_data; }
float m_range;
private:
std::vector<int> m_data;
};
int main()
{
MyClass myClass;
myClass.GetData().push_back(1);
myClass.GetData().push_back(2);
for (auto it = myClass.GetData().begin(); it != myClass.GetData().end(); it++)
{
//stuff
}
}
Run Code Online (Sandbox Code Playgroud) int main()
{
string s("some string");
if (s.begin() != s.end())
auto it = s.begin();
*it = toupper (*it) ; // Error ; the identifier "it" is undefined
}
Run Code Online (Sandbox Code Playgroud)
为什么*它未定义?为什么我们需要在迭代器维度中使用dereference?
给出以下代码段:
public class Foo
{
public IEnumerable<string> Sequence { get; set; }
public IEnumerable<string> Bar()
{
foreach (string s in Sequence)
yield return s;
}
}
Run Code Online (Sandbox Code Playgroud)
以下代码片段在语义上是等价的,还是不同?如果不同,它们的功能如何不同?
public class Foo2
{
public IEnumerable<string> Sequence { get; set; }
public IEnumerable<string> Bar2()
{
return Sequence;
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题的灵感来自于这个问题,它提出了一个类似情况的不同问题.
iterator ×6
c++ ×4
c# ×1
compilation ×1
dereference ×1
java ×1
memset ×1
set ×1
stl ×1
vector ×1
yield-return ×1