有没有办法重命名map迭代器的第一个和第二个访问器函数.我知道他们有这些名称是因为代表键和值的底层对,但我希望迭代器更具可读性.我认为这可能是使用迭代器适配器,但我不知道如何实现它.
请注意,我不能使用提升.
我的意思是:
map<Vertex, Edge> adjacency_list;
for(map<Vertex, Edge>::iterator it = adjacency_list.begin();
it != adjacency_list.end();
++it)
{
Vertex v = it->first;
//instead I would like to have it->vertex
}
Run Code Online (Sandbox Code Playgroud) 我想将一个std :: map的内容复制到另一个.我可以用std::copy它吗?显然,以下代码不起作用:
int main() {
typedef std::map<int,double> Map;
Map m1;
m1[3] = 0.3;
m1[5] = 0.5;
Map m2;
m2[1] = 0.1;
std::copy(m1.begin(), m1.end(), m2.begin());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这不会因为工作copy会叫operator*上m2.begin()为"解引用",并分配一个值(所有值的类型的std::pair<const int, double>).然后它将调用operator++移动到下一个空间m2.这两个操作都因为constin const int而无法工作,并且没有为任何新元素保留空间.
有没有办法让它适用std::copy?
谢谢!
我正在尝试删除向量的内容而我收到错误 - 向量迭代器不可递增,为什么会这样?
这是我的析构函数:
City::~City()
{
vector <Base*>::iterator deleteIterator;
for (deleteIterator = m_basesVector.begin() ; deleteIterator != m_basesVector.end() ; deleteIterator++)
m_basesVector.erase(deleteIterator);
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我们都知道在使用时Collections.synchronizedXXX(例如synchronizedSet())我们获得了底层集合的同步"视图".
但是,这些包装器生成方法的文档指出,在使用迭代器迭代集合时,我们必须在集合上显式同步.
您选择哪个选项来解决此问题?
我只能看到以下方法:
iterator()CopyOnWriteArrayList/ Set)并且作为一个额外的问题:当使用同步视图时 - 使用foreach/Iterable线程安全吗?
我正在使用字符串的TreeMap TreeMap<String, String>,并使用它来实现单词的Dictionay.
然后我有一个文件集合,并希望在字典定义的向量空间(单词空格)中创建每个文件的表示.
每个文件都应该有一个向量来表示它,具有以下属性:
所以我的想法是使用a Vector<Boolean>来实现这些向量.(这种表示集合中文档的方式称为布尔模型 - http://www.site.uottawa.ca/~diana/csi4107/L3.pdf)
我在创建这个向量的过程中遇到的问题是我需要一种方法来查找字典中单词的位置,如下所示:
String key;
int i = get_position_of_key_in_Treemap(key); <--- purely invented method...
Run Code Online (Sandbox Code Playgroud)
1)我可以在TreeMap上使用这样的方法吗?如果没有,你能不能提供一些代码来帮助我自己实现它?
2)TreeMap上是否有一个迭代器(它按字母顺序排列),我可以获得它的位置?
3)最终我应该使用另一个类来实现字典?(如果你认为使用TreeMaps我不能做我需要的)如果是的话,哪个?
提前致谢.
增加部分:
由dasblinkenlight提出的解决方案看起来很好,但是存在复杂性问题(由于将密钥复制到数组中而与字典的维度呈线性关系),并且不能接受为每个文件执行此操作的想法.
对我的问题还有其他想法吗?
根据我发现的一些STL文档,在std :: list中插入或删除元素不会使迭代器失效.这意味着允许循环遍历列表(从begin()to end()),然后使用push_front添加元素.
例如,在下面的代码中,我使用元素a,b和c初始化一个列表,然后遍历它并执行元素的push_front.结果应该是cbaabc,这正是我得到的:
std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");
for (std::list<std::string>::iterator itList = testList.begin(); itList != testList.end(); ++itList)
testList.push_front(*itList);
for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
std::cout << *itList << std::endl;
Run Code Online (Sandbox Code Playgroud)
当我使用反向迭代器(从rbegin()to 循环rend())并使用push_back时,我会期望类似的行为,即abccba的结果.但是,我得到了不同的结果:
std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");
for (std::list<std::string>::reverse_iterator itList = testList.rbegin(); itList != testList.rend(); ++itList)
testList.push_back(*itList);
for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
std::cout << *itList << std::endl;
Run Code Online (Sandbox Code Playgroud)
结果不是abccba,但是abcccba.这是正确的,还有一个额外的c.
看起来第一个push_back也改变了用rbegin()初始化的迭代器的值.在push_back之后,它不再指向列表中的第3个元素(之前是最后一个元素),而是指向第4个元素(现在是最后一个元素).
我使用Visual Studio …
如果我错了,请纠正我.谢谢!
insert并且erase将重新定位元素,但是在插入/擦除发生的位置之前的元素不会重新定位,因此它们的迭代器保持有效.
push_back并且pop_back不要使任何迭代器无效.
push_front和pop_front无效所有迭代器.
swap 不会重新定位元素,但不知何故,我认为它应该使迭代器无效.
我用Java8 定义natural了Stream自然数的无限序列()iterator.
IntStream natural = IntStream.iterate(0, i -> i + 1);
natural
.limit(10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
现在,我想用Java8定义它generator.
静态流生成(供应商)
什么是最简单的方法?谢谢.
我需要遍历a BucketMap并获取所有内容,keys但是如何在不buckets[i].next.next.next.key尝试手动操作的情况下进行操作,如我在此处尝试的那样:
public String[] getAllKeys() {
int j = 0; //index of string array "allkeys"
String allkeys[] = new String[8];
for(int i = 0; i < buckets.length; i++) { //iterates through the bucketmap
if(buckets[i] != null) { //checks wether bucket has a key and value
allkeys[j] = buckets[i].key; //adds key to allkeys
j++; // counts up the allkeys index after adding key
if(buckets[i].next != null) { //checks wether next has a key and value
allkeys[j] …Run Code Online (Sandbox Code Playgroud) 据我了解,下面的代码应打印true,因为两者Stream并Iterator指向的第一个元素.
但是,当我运行以下代码时,它正在打印false:
final HashMap<String, String> map = new HashMap<>();
map.put("A", "B");
final Set<Map.Entry<String, String>> set = Collections.unmodifiableMap(map).entrySet();
Map.Entry<String, String> entry1 = set.iterator().next();
Map.Entry<String, String> entry2 = set.stream().findFirst().get();
System.out.println(entry1 == entry2);
Run Code Online (Sandbox Code Playgroud)
不同行为的原因是什么?